装饰者模式就是对某个对象进行增强,可以和面向对象编程中的继承比对理解。
这里通过举例来说明
继承:咖啡
class 咖啡{ }
class 加冰咖啡 extends 咖啡{}
class 加糖咖啡 extends 咖啡{}
class 加奶咖啡 extends 咖啡{}
如果这个时候需要一个加糖加奶的咖啡还是需要重新写一个子类,非常不方便。
装饰:
class 咖啡{ }
class 加冰咖啡 extends 咖啡{}
class 加糖咖啡 extends 咖啡{}
class 加奶咖啡 extends 咖啡{}
如果需要综合口味:
咖啡 a=new 加冰咖啡();
加糖咖啡 b=new 加糖咖啡(a);//加糖加冰咖啡
加奶咖啡 c=new 加奶咖啡(b).//加糖加冰加奶咖啡
通过上面的例子可以得到装饰者模式和继承的区别:
继承:
- 被增强的对象固定
- 增强的内容固定
装饰:
- 被增强的对象可以切换
- 增强的内容固定
装饰者模式需要传入一个被增强的对象,但是这个对象的具体类型可以不确定(需要直到父类就行)。
装饰者模式的实现用一句话来概括:是你还有你,一切拜托你!
这里举例 java连接池中通过修饰者模式对连接对象进行修饰,增强其中的close()方法
class MyConnection implements Connection {//是你
// 还有你
private Connection con;//底层对象,被增强对象
public MyConnection(Connection con){//通过构造器传递底层对象!
this.con = con;
}
// 一切拜托你
public Statement createStatement() {
return con.createStatement();
}
// 增强点
public void close(){
把当前连接归还给池!
}
}