应用场景
目的:我们想将一个接口的方法具体实现覆盖,换成自己的操作,但是我们不知道该接口的具体实现类是哪个,这个时候可以采用装饰者模式,或代理模式
-
直接改源码 无法实现。
-
继承, 必须得知道这个接口的具体实现是谁,但我们不知道具体实现类是哪个。
-
使用装饰者模式。
逻辑结构如图:
实际应用场景
自搭数据库连接池,对连接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; }