zoukankan      html  css  js  c++  java
  • 包装设计模式——

     首先建立数据连接成(自己建立的)
    /**
     * 存在必要性?
     *         数据库连接作为非常重要的资源 ,用完了要不要立即销毁?----(不能立即关闭)
     * 不能立即关闭?谁维护
     *             ---------------专门交给一个人来管理(池-----------池子中放了好多数据库连接)
     *
     * 非常 有必要存在!!!
     *                 池子在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());
        }
    
    
    



  • 相关阅读:
    javascript 变量定义
    javascript之String
    javascript之object
    javascript之Number
    javascript之window对象
    javascript全局对象
    【NOIP2017】【Luogu3951】小凯的疑惑
    【NOIP2008】【Luogu1149】火柴棒等式
    【NOIP2008】【Luogu1125】笨小猴
    【NOIP2005】【Luogu1051】谁拿了最多奖学金
  • 原文地址:https://www.cnblogs.com/baijin05/p/5073764.html
Copyright © 2011-2022 走看看