修饰者模式下的简易连接池操作

xiaoxiao2021-02-28  83

增前方法 1.继承 2.装饰者模式(静态代理) 3.动态代理

装饰者模式: 使用步骤: 1.装饰者和被装饰者实现同一个接口或者继承同一个类 2.装饰者中要有被装饰者的引用 3.对需要增强的方法进行加强 4.对不需要加强的方法调用原来方法

/** * TestDs.java * 测试被装饰者模式修饰的连接池功能 * */ package com.datasource.myConn; import java.sql.Connection; import java.sql.SQLException; public class TestDs { public static void main(String[] args) throws SQLException { // 创建连接池 MyDataSource ds = new MyDataSource() ; //获取连接 Connection conn = ds.getConnection() ; System.out.println(conn); //归还连接 conn.close(); } } /** * MyDataSource.java * 这个是简易连接池的实现 */ package com.datasource.myConn; import java.sql.Connection; import java.sql.SQLException; import java.util.LinkedList; import com.utils.JdbcUtils; /** * 简易的连接池 * @author 25367 * */ public class MyDataSource { static LinkedList<Connection> pool = new LinkedList<>() ; static { //初始化的时候需要放入3个连接 for(int i = 0; i<3; i++) { try { Connection conn = JdbcUtils.getConnection() ; pool.addLast(conn); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //从连接池中获取连接 public static Connection getConnection() { if(pool.isEmpty()) { // 再添加2个连接进去 for(int i = 0; i<3; i++) { try { Connection conn = JdbcUtils.getConnection() ; pool.addLast(conn); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } System.out.println("从连接池中获取一个连接."); Connection conn = pool.removeFirst() ; // 将conn进行包装 //ConnectionWarp myConn = new ConnectionWarp(conn) ; // 将pool链表作为参数传输是为了可以在修饰者类中可以归还连接 ConnectionWarp myConn = new ConnectionWarp(conn,pool) ; return myConn ; } //归还连接的方法 public static void addBack(Connection conn) { // 将conn放入到list的最后面即可 pool.addLast(conn); System.out.println("连接已归还."); } } /** * ConnectionWarp.java * 这个类就是修饰者类了 * 它继承的是Connection接口 */ package com.datasource.myConn; import java.sql.Array; import java.sql.Blob; import java.sql.CallableStatement; import java.sql.Clob; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.NClob; import java.sql.PreparedStatement; import java.sql.SQLClientInfoException; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.SQLXML; import java.sql.Savepoint; import java.sql.Statement; import java.sql.Struct; import java.util.LinkedList; import java.util.Map; import java.util.Properties; import java.util.concurrent.Executor; public class ConnectionWarp implements Connection { private Connection conn; private LinkedList<Connection> list; public ConnectionWarp(Connection conn) { this.conn = conn ; } public ConnectionWarp(Connection conn,LinkedList<Connection> list) { this.conn = conn ; this.list = list ; } @Override // 不需要加强的方法 调用原来的 public Statement createStatement() throws SQLException { // TODO Auto-generated method stub return conn.createStatement(); } @Override // 不需要加强的方法 调用原来的 public PreparedStatement prepareStatement(String sql) throws SQLException { return conn.prepareStatement(sql); } @Override // 需要加强的方法 public void close() throws SQLException { //添加到连接池中 System.out.println("前"+list.size()); list.addLast(this) ; System.out.println("后"+list.size()); System.out.println("已经归还到连接池中"); } @Override public <T> T unwrap(Class<T> iface) throws SQLException { // TODO Auto-generated method stub return conn.unwrap(iface); } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { // TODO Auto-generated method stub return false; } @Override public CallableStatement prepareCall(String sql) throws SQLException { // TODO Auto-generated method stub return null; } @Override public String nativeSQL(String sql) throws SQLException { // TODO Auto-generated method stub return null; } //...... 后面省略了其他的需要覆写的函数 }

转载请注明原文地址: https://www.6miu.com/read-46023.html

最新回复(0)