一、装饰模式的基本概念
1.装饰模式的动机与意图
装饰模式的主要意图:
动态地给一个对象添加一些额外地职责。就增加功能而言,装饰模式相比生成子类而言更加灵活。
动机:
给某个对象而不是整个类添加一些功能。
适用场景:
1.在不影响其它对象的前提下,以动态、透明的方式给单个对象添加职责。
2.处理那些可以撤销的临时职责。
3.当不能使用生成子类的方法去进行扩充时
2.装饰模式的典型结构图
Component:
抽象基类,提供统一的对象接口。
ComcreteComponent:
Component类的具体实现类。
Decorator:
装饰器抽象类,其定义了与Component接口一致的接口,并有一个指向Component对象的指针。
ConcrteDecorator:
具体装饰器类,可以给继承了Component类的对象动态地添加职责。
3.装饰模式的优缺点
主要优点:
1.比继承更加灵活
2.避免在层次结构高层的类有太多特征
主要缺点:
1.Decorator与它的Component不一样
2.会生成许多小对象
二、C++代码实例
1.C++代码
代码如下(示例):
#include <iostream>
using namespace std;
class Component{
public:
virtual void Operation(void) = 0;
};
class ConcreteComponent : public Component{
public:
void Operation(void){
cout << "ConcreteComponent operation" << endl;
};
};
class Decorator : public Component{
protected:
Component * target;/*被装饰的目标*/
public:
void Operation(void){
target->Operation();
};
};
class ConcreteDecorator : public Decorator{
public:
ConcreteDecorator(Component * target_in){
this->target = target_in;
};
/*新增的职责(功能)*/
void AddedBehavior(void){
cout << "AddedBehavior" << endl;
};
/*重新定义的Operation函数*/
void Operation(void){
/*下面例子为:调用Component的Operation与新增行为*/
/*这里的逻辑可以根据实际需求而定*/
Decorator::Operation();
AddedBehavior();
};
};
int main() {
/*使用示例*/
Component * c1 = new ConcreteComponent();//创建ConcreteComponent对象
Decorator * d1 = new ConcreteDecorator(c1);//使用ConcreteDecorator对象装饰c1对象
d1->Operation();
return 0;
}
2.代码运行结果
代码运行结果: