装饰模式

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. 以此类推,如果构件与装饰者都只有一个时,我们可以直接只用装饰者继承构件,实现功能的扩展。

 

以上是关于装饰模式的主要内容,如果未能解决你的问题,请参考以下文章

Thymeleaf 模板 - 有没有办法装饰模板而不是包含模板片段?

swift设计模式学习 - 装饰模式代码大全

设计模式---装饰者模式

设计模式之单例模式

装饰模式与代理模式的区别

Java设计模式之装饰者模式