装饰者模式

应用场景
目的:我们想将一个接口的方法具体实现覆盖,换成自己的操作,但是我们不知道该接口的具体实现类是哪个,这个时候可以采用装饰者模式,或代理模式

  1. 直接改源码 无法实现。

  2. 继承, 必须得知道这个接口的具体实现是谁,但我们不知道具体实现类是哪个。

  3. 使用装饰者模式。

逻辑结构如图:

实际应用场景
自搭数据库连接池,对连接Connection的对象con回收,如何调用 con.close()方法,不是去关闭con而是去回收con;

  • 新建接口实现 Connection ,传入Connection con对象作为参数 ,传入 List consList 回收器
  • 在close()方法,写入自身逻辑,覆盖传入Connection的 close()方法 ;
  • 其余Connection的实现方法,利用传入参数 con去调用;
           /**
               *  实现Connection 接口,传入 Connection 对象作为参数,其他方法都和对象取出一致
               *  就 修改的方法做修改 
               */
           public class ConnectionWraper implements Connection{

                private Connection con ;

                private List<Connection> consList ;

                public ConnectionWraper(Connection con,List<Connection> consList) {

                     this.consList = consList;

                     this.con = con;

                }

                /**

                 * 将传入的Connection对象的close()方法做覆盖 

                 */

                @Override

                public void close() throws SQLException {

                     consList.add(con);

                }
       }

  • 将获取的Connection 对象con对象传入装饰者类进行包装;
             public Connection getConnection() throws SQLException {
    
                  /**
                   *   每次请求释放一个连接 
                   */
                  if(cons.size() == 0 ) {
                      for(int i=0 ; i<5 ; i++ ) {
                           Connection con;
                           try {
                                con = DBUtil.getConnection();
                                cons.add(con);
                           } catch (Exception e) {
                                e.printStackTrace();
                           }
                      }
                  }
    
                  // list 每次只移除最新的连接 -----remove(0)
                  Connection con = cons.remove(0);
                  // 对连接对象做一步封装 ,对象的部分方法被覆盖
                  Connection result_con = new  ConnectionWraper(con, cons);           
                  return result_con;
    
             }
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值