- 定义
在不改变原有对象的基础上,将功能附加到对象上
- 提供了比继承更有弹性的替代方案(扩展原有对象功能)
- 适用场景
扩展一个类的功能或者给一个类添加附加职责
动态的给一个对象添加功能,这些功能可以动态撤销
示例代码(继承模式的)
public class Battercake {
public String getDesc(){
return "这是一个煎饼";
}
public Integer getPrice(){
return 8;
}
}
public class BattercakeWithEgg extends Battercake{
@Override
public String getDesc(){
return super.getDesc()+"加蛋";
}
@Override
public Integer getPrice(){
return super.getPrice()+1;
}
}
Test测试类
public class Test {
public static void main(String[] args) {
Battercake battercake=new Battercake();
System.out.println("煎饼花费了"+battercake.getPrice());
BattercakeWithEgg battercakeWithEgg=new BattercakeWithEgg();
System.out.println("带蛋的煎饼花费"+battercakeWithEgg.getPrice());
}
}
以上代码可以看到如果购买加了两个鸡蛋的煎饼,那么又要增加子类,购买的组合可能有多个,会导致类爆炸的情况。
下面使用装饰者模式
public abstract class AbstractBatterCake {
public abstract String getDesc();
public abstract Integer getPrice();
}
public class BatterCake extends AbstractBatterCake{
public String getDesc() {
return "这是一个煎饼";
}
public Integer getPrice() {
return 8;
}
}
public abstract class AbstractDecorator extends AbstractBatterCake{
private AbstractBatterCake abstractBatterCake;
public AbstractDecorator(AbstractBatterCake abstractBatterCake){
this.abstractBatterCake=abstractBatterCake;
}
@Override
public String getDesc(){
return this.abstractBatterCake.getDesc();
}
@Override
public Integer getPrice(){
return this.abstractBatterCake.getPrice();
}
}
public class EggDecorator extends AbstractDecorator{
public EggDecorator(AbstractBatterCake abstractBatterCake) {
super(abstractBatterCake);
}
@Override
public String getDesc(){
return super.getDesc()+"加一个鸡蛋";
}
@Override
public Integer getPrice(){
return super.getPrice()+1;
}
}
测试类Test
public class Test {
public static void main(String[] args) {
AbstractBatterCake abstractBatterCake = new BatterCake();
abstractBatterCake = new EggDecorator(abstractBatterCake);
abstractBatterCake = new EggDecorator(abstractBatterCake);
System.out.println(abstractBatterCake.getPrice());
}
}
输出结果
10
通过装饰器模式可以比继承更灵活。