装饰模式
Posted yuemw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰模式相关的知识,希望对你有一定的参考价值。
一、何为装饰模式
1. 定义
顾名思义,装饰模式就是为原有的对象添加不同的装饰,使得原有对象具备更加完善的功能。
2. 应用场合
在原有代码基础上进行重构或者添加一些新的职责时,为了尽可能的不修改原有代码或者提高原有类的复杂度,可以使用装饰者模式。装饰者模式可以提供以下功能:
1)在不影响类的其他对象的前提下,动态的给指定对象添加职责;
2)动态的为一个对象添加或者删除功能;
3)为不能采用继承的方式进行系统功能扩充的场合提供解决方案。
3. 结构图
Component为待扩展功能的原型类;
ConcreteComponent继承于原型类,提供原型类的具体实现,为本模式中的被装饰的类;
Decorator是实现装饰功能的基类,内部包含一个被装饰的类ConcreteComponent的实例,可以通过构造函数或者接口进行赋值;
ConcreteDecorator继承于Decorator,实现具体的装饰操作,每种子类都可以提供不同装饰功能
4. 特点
使用装饰模式可以:动态扩展类的原有功能;防止类的职责爆炸式增长。
二、代码示例
1. 场景
为一个汽车的实现类进行装饰,完成汽车的改装工作。
class Car { public: Car(QString name) : m_name(name) {}; ~Car(); virtual void func(); private: QString m_name; }; class MyCar : public Car { public: MyCar(QString name) : Car(name) {}; ~MyCar(); virtual void func() { //we can drive }; }; class DecoratorCar : public Car { public: DecoratorCar(Car *car) : Car("mycar") , m_car(car) {}; ~DecoratorCar(); protected: Car *m_car; }; class FlyDecoratorCar : public DecoratorCar { public: FlyDecoratorCar(Car *car) : DecoratorCar(car) {}; ~FlyDecoratorCar(); virtual void func() { fly(); m_car->func(); } private: void fly() { //we can fly }; }; //此处可以继续添加装饰类,为Car提供更多的功能 void main() { Car *mycar = new MyCar("mycar"); FlyDecoratorCar *flyCar = new FlyDecoratorCar(mycar); flyCar->func(); }
以上为一个简单的例子,为已经创建出的原始对象mycar提供了飞行的功能。
三、总结
在使用装饰模式的时候,可以根据实际的使用场合,对本模式进行相应的修改,以更好的适配编码需求。
如下有几种变化版的装饰者模式:
1.只有一个具体装饰者,这样就不需要抽象装饰者,具体装饰者直接继承抽象构件就可以:
2.同样,如果只有一个构件,则不需要进行构件的抽象,如下:
3. 以此类推,如果构件与装饰者都只有一个时,我们可以直接只用装饰者继承构件,实现功能的扩展。
以上是关于装饰模式的主要内容,如果未能解决你的问题,请参考以下文章