• 包装设计模式——


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



  • 相关阅读:
    查看.Net Framework版本的方法
    SQL2008 强烈要求限制最大内存
    Winform用匿名方法新建线程的方法
    Qt编写项目作品27-多线程文件传输
    Qt编写项目作品26-一维码二维码解析及生成
    Qt编写的项目作品25-硬件综合应用(热敏打印+身份证+短信猫)
    Qt编写的项目作品24-人脸识别综合应用(在线+离线+嵌入式)
    Qt开源作品5-仪表盘交互
    Qt开源作品4-网络调试助手
    Qt开源作品3-串口调试助手
  • 原文地址:https://www.cnblogs.com/baijin05/p/5073764.html
Copyright © 2020-2023  润新知