一、UML图
二、包含的角色
(1)Component是一个对象接口,可以给对象动态的添加职责
(2)ConcreteComponent 定义了一个具体的类,可以给这个类添加一些职责
(3)Decorater 为装饰的抽象类,继承了Component,从外类来扩展Component的功能,但对于Component来说。是无需知道Decorater的存在的
(4)ConcreteDecorater为装饰的具体类,起到给Component添加职责的功能。
三、特点
定义:装饰模式(Decorater),动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
(1)装饰模式是为已有功能动态的添加更多功能的一种方式
(2)当系统需要新功能的时候,是向旧的类中添加新的代码,这些代码通常装饰了原有类的核心职责或主要行为。在主类中加入新的字段,新的方法和新逻辑,增加了主类的复杂度,但是这些新加入的东西仅仅是为了满足 一些只在某种特定 情况下才会执行的特殊行为的需求。而装饰模式提供了一种好的解决方案,把每个需要装饰的功能封装在单独的类中,并让这个类去包装它所要装饰的对象,因此,执行特殊行为时候,客户代码就可以在运行时根据需要,选择的,按顺序的使用装饰功能包装对象。
优点:把类的装饰功能从类中搬走,降低了主类的复杂度,有效的将类的核心功能和修饰功能分离,而且可以去除相关类中重复的修饰逻辑。
使用场合:
(1)需要在内部组装完成显示出来的情况。
(2)装饰模式的建造过程不稳定。
(3)我们需要把所需的功能按正确的顺序串联起来进行控制。
四、代码实现
Component类
class Component
{
public:
virtual void Operation() = 0;
};
ConcreteComponent类
class ConcreteComponent : public Component
{
public:
void Operation();
};
Dectorater类
Dectorater.h
#include "Component.h"
class Decorater : public Component
{
private:
Component* _component;
public:
void Operation();
void SetComponent(Component* component);
};
Dectorater.cpp
#include "Decorater.h"
void Decorater::Operation()
{
if (_component!=NULL)
{
_component->Operation();
}
}
void Decorater::SetComponent(Component * component)
{
_component = component;
}
ConcreteDecorater类
#include "Decorater.h"
class ConcreteDecoraterA : public Decorater
{
public:
void Operation();
private:
int Attribute;
};
void ConcreteDecoraterA::Operation()
{
Decorater::Operation();
printf("2");
}
调用方式
#include "ConcreteComponent.h"
#include "ConcreteDecoraterA.h"
#include "ConcreteDecoraterB.h"
int main()
{
ConcreteComponent* cC = new ConcreteComponent();
ConcreteDecoraterA* cDa = new ConcreteDecoraterA();
ConcreteDecoraterB* cDb = new ConcreteDecoraterB();
cDa->SetComponent(cC);
cDb->SetComponent(cDa);
cDb->Operation();
delete cDb;
delete cDa;
delete cC;
return 0;
}