装饰者模式(Decorator Pattern)是指在不改变原有对象的基础上进行扩展,将功能附加到对象上,提供比继承更有弹性的方案,属于结构性模式。在生活中,像人们搭配衣服,吃个煎饼果子加餐。
适用场景
- 扩展一个类的功能,或给一个类添加附加功能
- 动态的给类添加一个功能,这些功能在动态撤销
下面以买煎饼果子为例
- 煎饼类
public class Pancake {
public String getMessage(){
return "煎饼";
}
public int getPrice(){
return 5;
}
}
- 煎饼装饰类
public class PancakeDecorator extends Pancake {
private Pancake pancake;
public PancakeDecorator(Pancake pancake) {
this.pancake = pancake;
}
@Override
public String getMessage() {
return pancake.getMessage();
}
@Override
public int getPrice() {
return pancake.getPrice();
}
}
- 鸡蛋类
public class Egg extends PancakeDecorator {
public Egg(Pancake pancake) {
super(pancake);
}
@Override
public String getMessage() {
return super.getMessage()+"+一个鸡蛋";
}
@Override
public int getPrice() {
return super.getPrice()+2;
}
}
- 火腿类
public class Hams extends PancakeDecorator {
public Hams(Pancake pancake) {
super(pancake);
}
@Override
public String getMessage() {
return super.getMessage() + "+ 火腿";
}
@Override
public int getPrice() {
return super.getPrice() + 2;
}
}
- 运行
public class Run {
public static void main(String[] args) {
Pancake pancake = new Pancake();
pancake=new PancakeDecorator(new Egg(pancake));
pancake=new PancakeDecorator(new Hams(pancake));
pancake=new PancakeDecorator(new Hams(pancake));
pancake=new PancakeDecorator(new Hams(pancake));
pancake=new PancakeDecorator(new Hams(pancake));
System.out.println(pancake.getMessage()+"---"+pancake.getPrice());
}
}
- 结果
煎饼+一个鸡蛋+ 火腿+ 火腿+ 火腿+ 火腿---15
- 优点
- 对继承的补充,比继承灵活,可以在不改变原有的对象情况下对对象进行功能扩展
- 使用不同的装饰类可以实现不同的效果
- 完全符合开闭原则
- 缺点
- 增加程序的复杂性