zoukankan      html  css  js  c++  java
  • 装饰者模式&数据库连接池原理

     装饰者模式 我是一个没有感情的杀手

    在复习到自建数据库连接池的时候有点蒙了,再次翻看视频整理如下:(装饰者模式下自建数据库连接池修改close功能为 回收连接对象)

    自备材料:数据库连接对象的获取的工具类 jdbcUtils(产出数据库连接对象getConnection 以及 释放资源的close)

    —————————————————————————————————————————————————

    public class MyDataSource implements DataSource {
      List <Connection> list = new ArrayList<>();        //用来存放连接对象的集合(可以看作是一个池子)
      public MyDataSource() {                //构造方式中创建了10个连接对象,放到池子中
        for (int i = 0; i < 10; i++) {
          Connection conn = JDBCUtil.getConn();
          list.add(conn);
        }
      }

      @Override
      public Connection getConnection() throws SQLException {
        if(list.size() == 0 ){                  //获取连接对象之前自检一边池子中是否还有多余连接对象
          for (int i = 0; i < 5; i++) {               //如果拿那完了  我们每次设定涨幅为5个 ,再创建五个
            Connection conn = JDBCUtil.getConn();
            list.add(conn);
          }
        }

        Connection conn = list.remove(0);  //remove()  移除并返回该对象,我们就获得了一个连接池对象,且池子中也相应的减少
        Connection connection = new ConnectionWrap(conn, list);   //在把这个对象抛出去的时候, 对这个对象进行包装。(关键所在)
        return connection;                    //返回包装后的对象
      }

    —————————————————————————————————————————————————

    装饰者模式下的包装类

    public class ConnectionWrap implements Connection{           
      Connection connection = null;
      List <Connection> list ;
      public ConnectionWrap(Connection connection , List <Connection> list) {   //为全局变量赋值 ,待会儿需要  
        super();
        this.connection = connection;
        this.list = list;
      }

      @Override
      public void close() throws SQLException {      //这个是我们要使用到的方法 所以对其进行装饰修改
        //connection.close();              //原本close() 是释放资源用的 现在我们不要他释放资源了  我们对其变更功能     
        list.add(connection);              //将该连接对象,回收到我们的池中中
      }

      //这个方法待会儿我们也要使用,但我们不打算更改,所以调用之前的方法即可
      @Override
      public PreparedStatement prepareStatement(String sql) throws SQLException {   
        return connection.prepareStatement(sql);
       }

    .......

    ———————————————————————————————————————————————————

    这样一套太极打下来:

      当我们从自建数据源 MyDataSource 中获取对象时, 返回给我们的对象是一个也实现Connection方法的 自建对象,  当我们要调用某个方法时,调用的是这个自建对象中方法,

        如果我们不想对某个方法进行改变, 但又需要时,  使用通过构造传来的那个对象的方法即可

    装饰者的大概:

      实现相同的接口,被装饰类 通过装饰类的构造传入 ,作为装饰类的全局变量   想改变某个方式的逻辑时, 直接在装饰类中对应方法修改 ,如果不想改变 ,调用全局变量,启用被装饰类的方法

        在使用的时候, 我们就用装饰类,做我们想做的时候, 体现了多态的思想 

  • 相关阅读:
    Linux和Docker常用命令
    学习docker on windows (1): 为什么要使用docker
    使用xUnit为.net core程序进行单元测试(4)
    使用xUnit为.net core程序进行单元测试(3)
    高效地使用搜索引擎
    充分条件和必要条件
    上海全球“编程一小时”活动记
    C#.NET股票历史数据采集,【附18年历史数据和源代码】
    R学习笔记 ---- 系列文章
    平方根的原理
  • 原文地址:https://www.cnblogs.com/msi-chen/p/10196607.html
Copyright © 2011-2022 走看看