无论乌鸦怎样用孔雀的羽毛来装饰自己,乌鸦毕竟是乌鸦。 —— 斯大林
日常生活中,我们去肯德基、麦当劳吃饭,我们会点很多东西,服务员会在他们的点餐系统选择你点的食物,然后总价和清单就出来了,那这个系统是怎么实现的呢?还有就是我们去饭店,点完餐,服务员也会给一个点餐列表和总金额。今天我们来聊下这种系统利用的一种重要的设计模式——装饰器模式
1. 装饰器模式
定义
装饰器模式也叫包装模式,是指在不改变原有对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。
属于结构型设计模式。
适用场景
扩展一个类的功能或者给一个类添加职责。
动态的给一个对象添加功能,这些功能可以动态的撤销
优点
装饰器是继承的有力补充,比继承更灵活,不改变原有对象额情况下动态地给一个对象扩展功能,即插即用
通过使用不同装饰类以及这些装饰类的排列组合,可实现不同效果
装饰器完全遵守开闭原则
缺点
会出现更多的代码,更多的类,增加程序的复杂性
动态装饰时,多层装饰会更复杂
2. 不使用装饰器模式写法
public class JianBing {
public String getMsg() {
return "煎饼";
}
public int getPrice() {
return 5;
}
}
public class JianBingAddEgg extends JianBing {
@Override
public String getMsg() {
return super.getMsg() + ",加鸡蛋";
}
@Override
public int getPrice() {
return super.getPrice() + 2;
}
}
public class JianBingAddEggAndXiangchang extends JianBingAddEgg {
@Override
public String getMsg() {
return super.getMsg() + ",加香肠";
}
@Override
public int getPrice() {
return super.getPrice() + 2;
}
}
public class Test {
public static void main(String[] args) {
JianBing jianBing = new JianBing();
System.out.println(jianBing.getMsg() + ",总价:" + jianBing.getPrice());
JianBingAddEgg jianBing1 = new JianBingAddEgg();
System