定义
- 再不改变原有对象的基础上,将功能附加到对象上,提供了比继承更具有弹性的替代方案
适用场景
- 用于扩展一个类的功能,添加职责
- 动态的给对象添加功能,这些功能可以再动态的撤销
装饰器实例
public abstract class Cake {
public abstract String getMsg();
public abstract int getPrice();
}
public class BaseCake extends Cake {
@Override
public String getMsg() {
return "蛋糕";
}
@Override
public int getPrice() {
return 10;
}
}
public class BaseCakeDecorator extends BaseCake{
private BaseCake baseCake;
public BaseCakeDecorator(BaseCake baseCake) {
this.baseCake = baseCake;
}
public String getMsg() {
return this.baseCake.getMsg();
}
public int getPrice() {
return this.baseCake.getPrice();
}
}
public class BaseCakeWithAppleDecorator extends BaseCakeDecorator {
public BaseCakeWithAppleDecorator(BaseCake baseCake) {
super(baseCake);
}
public String getMsg() {
return super.getMsg() + "1个苹果";
}
public int getPrice() {
return super.getPrice() + 1;
}
}
public class BaseCakeWithEggDecorator extends BaseCakeDecorator {
public BaseCakeWithEggDecorator(BaseCake baseCake) {
super(baseCake);
}
public String getMsg() {
return super.getMsg() + "1个鸡蛋";
}
public int getPrice() {
return super.getPrice() + 5;
}
}
public class Test {
public static void main(String[] args) {
BaseCake baseCake = new BaseCake();
baseCake = new BaseCakeWithEggDecorator(baseCake);
baseCake = new BaseCakeWithAppleDecorator(baseCake);
System.out.println(baseCake.getMsg()+ "总价," + baseCake.getPrice());
}
}
实现
- inputStream
- bufferInputStream
- bufferReader
- spring transationAwareCacheDecorator
- mybatis Cache
与其他设计模式区别
- 装饰器是一种特殊的静态代理模式
- 装饰器强调自身功能的扩展
- 代理强调代理过程的控制
优点
- 使继承的有利补充,比继承灵活,不改变原有对象的情况下动态的给一个对象扩展,即插即用
- 不同的装饰器进行排列组合,可以实现不同的效果
- 遵循开闭原则
缺点
- 会出现更多的代码,更多的类,增加程序的复杂性
- 动态装饰,多层装饰会更复杂