装饰者模式

一、前言

装饰模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时也是继承关系的一种替代方案之一。装饰模式中装饰物也许各不相同但是装饰的对象本质是不变的。

二、定义

在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象功能)。

三、适用场景

扩展一个类的功能或给一个类添加附加职责。

四、相关设计模式

1、装饰者模式和代理模式
装饰者模式关注在对象上动态的添加,代理模式控制对对象的访问,代理类可以对他的客户隐藏对象的具体信息,使用代理模式的时候通常在代理类中创建一个对象的实例。而在使用装饰者模式的时候,通常会把原始对象作为一个参数传给装饰者的构造器。
2、装饰者模式和适配器模式
装饰者模式和适配器模式都可以叫做包装模式,装饰者和被装饰者可以实现相同的接口,或者装饰者是被装饰者的子类。在适配器模式中,适配器和被适配的类有不同的接口。

五、代码实战

引入一个场景,上班晚了公司楼下有卖煎饼的,买个煎饼,在公司茶水间吃早餐,有时候加个蛋有时候加根肠,那我们想一下商家在卖煎饼的时候加肠、加蛋的价格是怎么计算的。

首先先创建一个煎饼的抽象类,
屏幕快照 2019-04-30 下午2.21.11.png
然后我们在创建一个普通煎饼的类,也就我们需要装饰的原始对象,继承ABattercake,
屏幕快照 2019-04-30 下午2.21.55.png

接着创建一个装饰者来装饰我们的这个Battercake对象,在AbstractDecorator类中我们保持了一个对ABattercake类的引用,可以方便地调用具体被装饰对象中方法,这也是为什么我们可以在不破坏原类层次结构的情况下为类增加一些功能,我们只需要在被装饰对象的相应方法前或后增加相应的功能逻辑即可。在装饰物只有一个的情况下,可不必声明一个抽象类作为装饰者抽象的提取,仅需要订一个普通的类表示装饰者即可。如果装饰物还需要做一些自己特有的东西的话,可以将装饰者类声明为抽象类,并定义抽象方法,在不同的装饰物中实现具体的逻辑。
屏幕快照 2019-04-30 下午2.22.55.png
再接着创建加鸡蛋的煎饼的类,和加了香肠的煎饼的类,
屏幕快照 2019-04-30 下午2.24.07.png
屏幕快照 2019-04-30 下午2.24.20.png
测试:
屏幕快照 2019-04-30 下午2.25.07.png

UML类图:
屏幕快照 2019-04-30 上午11.24.45.png

六、总结

1、优点

(1)继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能。
(2)通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果。
(3)符合开闭原则

2、缺点

(1)会出现更多的diamanté,更多的类,增加程序复杂性。
(2)动态装饰时,多层装饰时会更复杂。

你可能感兴趣的:(装饰者模式)