包装设计模式——

 首先建立数据连接成(自己建立的)
/**
 * 存在必要性?
 *         数据库连接作为非常重要的资源 ,用完了要不要立即销毁?----(不能立即关闭)
 * 不能立即关闭?谁维护
 *             ---------------专门交给一个人来管理(池-----------池子中放了好多数据库连接)
 *
 * 非常 有必要存在!!!
 *                 池子在java类中如何表现?--------------------集合--------(Connection)----用什么集合?
 *
 * List  集合来模拟池
 *             1.初始化一些连接
 *
 * @author wangli
 *
 */
public class MyDataSource1 {
    private static  List<Connection> pool = new ArrayList<Connection>();//池子
    private static int size=10;
    public static void setSize(int size) {
        MyDataSource1.size = size;
    }
    
    //初始化池中的连接
    static{
        try {
            for (int i = 0; i < size; i++) {
                pool.add(JdbcUtil.getConnection());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    //统一提供方法,用于从池中获取连接
    public static synchronized Connection getConnection(){
        if(pool.size()>0){
            Connection con =  pool.remove(0);//删除这个连接,因为别人此时不能再用它
            
            //真正开始包装 别人
            MyConnection2 con2 = new MyConnection2(con,pool);
            return con2;
        }else{
            throw new RuntimeException("池中无连接");
        }
        
    }
    
    //还回一个连接到池中
    public static void close(Connection con){
        pool.add(con);//将这个连接回收到池中
    }

    //取池
    public static List<Connection> getPool() {
        return pool;
    }
    
    
    
}


一、外包装和被包装实现一样的接口
public class ConnectionAdapter implements Connection { } 二、
 //包装模式                                     //似你    
public class MyConnection2  extends ConnectionAdapter {
    private Connection con;//还有你
    private List<Connection> pool;
    //拜托你
    public MyConnection2(Connection con,List<Connection> pool){
        this.con  = con;
        this.pool = pool;
    }
    
    @Override  //改写它
    public void close() throws SQLException {
        pool.add(con);
    }

    
}
三、test测试一下
    /**
     * @param args
     */
    public static void main(String[] args) {
        MyDataSource1 myds = new MyDataSource1();
        System.out.println("初始化好了,池中连接数:"+myds.getPool().size());
        
        Connection con = myds.getConnection();//从池中取一个连接
        System.out.println("取出但未还,池中连接数:"+myds.getPool().size());
        
        System.out.println("当前连接对象:"+con);
        try {
            con.close();//面向接口编程,con其实是MyConnection2   对象。调用的是MyConnection2 .close()既被包装后改写的close()方法。
        } catch (SQLException e) {
            e.printStackTrace();
        }
        
        System.out.println("用完后还了,池中连接数:"+myds.getPool().size());
    }

 




 

posted @ 2015-12-24 17:20  白金05  阅读(114)  评论(0编辑  收藏  举报