1.简单介绍
装饰器模式(Decorator Pattern)也叫包装模式(Wrapper Pattern),是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。
属于结构型模式。
2.修饰器的优缺点
优点:
1、装饰器是继承的有力补充,比继承灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。
2、通过使用不同装饰类以及这些装饰类的排列组合,可实现不同效果。
3、装饰器完全遵守开闭原则。
缺点:
1、会出现更多的代码,更多的类,增加程序复杂性。
2、动态装饰时,多层装饰时会更复杂
3.模式结构
抽象构件(Component)角色:该角色用于规范需要装饰的对象(原始对象)。
具体构件(Concrete Component)角色:该角色实现抽象构件接口,定义一个需要装饰的原始类。
装饰(Decorator)角色:该角色持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰(Concrete Decorator)角色:该角色负责对构件对象进行装饰。
3.案例分析
在奶茶店里面购买奶茶时,可以要求在其中加入各种调料,奶茶店会根据所加入的调料收取不同的费用,也就是说不同的奶茶与调料之间有多种组合方式,每种奶茶和调料都有不同的收费,设计一种方案,当用户选择了奶茶和调料后,能够计算出总费用,同时满足奶茶和调料的灵活组合性和易拓展性。
(1)抽象构件类Component,此处定义为Beverage.java
(2)具体构件类ConcreteComponent,此处表示被修饰的类,被增加功能和方法的类,此处定义一个MilkTea,可以定义多个,一个类代表一种可以被修饰的类
(3)抽象修饰类Decorator,此处定义为Decorator ,注意抽象修饰类和具体构件类都要继承抽象构件类,此处都要继承Beverage。
(4)具体的修饰者,此处定义两个,分别是Mocha 和Soy ,两个具体修饰者都继承了抽象修饰者,而且都包含了抽象构件类型的属性,这样的话就可以在其方法中,调用实现了抽象构件类型的类或者对象的方法,再结合本身的方法,最终达到多个类中方法的组合,实现了扩展功能的目的。
(5)主类
运行结果:
4.总结
(1)抽象构件、具体构件(被修饰类)、抽象修饰类和具体修饰类四个角色要全,其中具体构件和抽象修饰类都要继承抽象构件类
(2)具体修饰类中要包含一个抽象构件类类型的属性,抽象类变量可以引用实现了抽象类的类的变量,可以容易拓展,不易出错。
5.装饰器模式和代理模式对比
1、装饰器模式就是一种特殊的代理模式。
2、装饰器模式强调自身的功能扩展。
3、代理模式强调代理过程的控制.