定义:在不改变原有对象的基础上,将功能附加到对象上
提供了比继承更有弹性的替代方案(扩展原有对象功能)
类型:结构型
适用场景
- 扩展一个类的功能或者给一个类添加附加职责
- 动态的给一个对象添加功能,这些功能可以再动态的撤销
优点
- 继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能
- 通过使用不同的装饰类,以及这些装饰类的排列组合,可以实现不同的效果
- 符合开闭原则
缺点
- 会出现更多的代码,更多的类,增加程序复杂性
- 动态装饰,多层装饰时会更复杂
例如:卖煎饼,加一个鸡蛋,加一根火腿,加一根大葱,都需要在煎饼的基础上进行扩展和组合,计算计算不同组合的价格
package design.decorator;
public abstract class BaseCake {
/** 描述*/
abstract String getDesc();
/** 花费(价格)*/
abstract int cost();
}
package design.decorator;
/**
* 煎饼
*/
public class Battercake extends BaseCake {
@Override
String getDesc() {
return "煎饼";
}
@Override
int cost() {
return 5;
}
}
package design.decorator;
/**
* 鸡蛋
*/
public class EggDecorator extends AbstractDecorator {
public EggDecorator(BaseCake baseCake) {
super(baseCake);
}
@Override
String getDesc() {
return super.getDesc() + " 加1个鸡蛋";
}
@Override
int cost() {
return super.cost() + 2;
}
}
package design.decorator;
/**
* 火腿
*/
public class HamDecorator extends AbstractDecorator {
public HamDecorator(BaseCake baseCake) {
super(baseCake);
}
@Override
String getDesc() {
return super.getDesc() + " 加1根火腿";
}
@Override
int cost() {
return super.cost() + 2;
}
}
package design.decorator;
/**
* 大葱
*/
public class ShallotDecorator extends AbstractDecorator {
public ShallotDecorator(BaseCake baseCake) {
super(baseCake);
}
@Override
String getDesc() {
return super.getDesc();
}
@Override
int cost() {
return super.cost();
}
}
package design.decorator;
public class Test {
public static void main(String[] args) {
Battercake battercake = new Battercake();
System.out.println(battercake.getDesc() + ": " + battercake.cost() + "元");
EggDecorator eggDecorator = new EggDecorator(battercake);
System.out.println(eggDecorator.getDesc() + ": " + eggDecorator.cost() + "元");
HamDecorator hamDecorator = new HamDecorator(eggDecorator);
System.out.println(hamDecorator.getDesc() + ": " + hamDecorator.cost() + "元");
}
}