无论乌鸦怎样用孔雀的羽毛来装饰自己,乌鸦毕竟是乌鸦。 —— 斯大林
日常生活中,我们去肯德基、麦当劳吃饭,我们会点很多东西,服务员会在他们的点餐系统选择你点的食物,然后总价和清单就出来了,那这个系统是怎么实现的呢?还有就是我们去饭店,点完餐,服务员也会给一个点餐列表和总金额。今天我们来聊下这种系统利用的一种重要的设计模式——装饰器模式
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.out.println(jianBing1

装饰器模式是一种结构型设计模式,用于在不修改原有对象的基础上,动态地给对象添加新的功能。它提供了一种比继承更灵活的扩展对象功能的方式,适用于动态添加职责或扩展功能。文章通过实例展示了装饰器模式的使用,包括不使用装饰器模式的缺点、抽象继承的实现方式,以及如何使用装饰器模式实现JSON格式日志。同时,文章还比较了装饰器模式与代理模式的区别,装饰器更注重功能扩展,而代理模式侧重于代理过程的控制。
最低0.47元/天 解锁文章
8万+





