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

来源:互联网 发布:企业级p2p项目源码 编辑:程序博客网 时间:2024/06/05 08:57


增前方法
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 blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.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 blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.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 stubreturn 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("已经归还到连接池中");}@Overridepublic <T> T unwrap(Class<T> iface) throws SQLException {// TODO Auto-generated method stubreturn conn.unwrap(iface);}@Overridepublic boolean isWrapperFor(Class<?> iface) throws SQLException {// TODO Auto-generated method stubreturn false;}@Overridepublic CallableStatement prepareCall(String sql) throws SQLException {// TODO Auto-generated method stubreturn null;}@Overridepublic String nativeSQL(String sql) throws SQLException {// TODO Auto-generated method stubreturn null;}//......  后面省略了其他的需要覆写的函数}



原创粉丝点击