装饰模式
:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
-
component
是定义一个对象接口,可以给这些对象动态地添加职责。 -
ConcreComponent
是定义了一个具体的对象,也可以给这个对象添加一些职责。 -
Decorator
装饰抽象类,继承了Component,从外类来扩展component类的功能,但对于componet来说,是无需知道Decorator的存在的。 -
ConcreteDecorator
是具体的装饰对象,起至给Component添加职责的功能。
利用setComponent
来对对象进行包装,这样每个装饰对象的实现就和如何使用这个对象分开了,每个装饰对象只关心自己的功能,不需要关心如何被添加至对象链当中
#include <iostream>
#include <ConcreteComponent.h>
#include <ConcreteDecoratorA.h>
#include <ConcreteDecoratorB.h>
using namespace std;
int main()
{
ConcreteComponent *c = new ConcreteComponent();
ConcreteDecoratorA *d1 = new ConcreteDecoratorA();
ConcreteDecoratorB *d2 = new ConcreteDecoratorB();
d1->SetComponent(c);
d2->SetComponent(d1);
d2->Operation();
getchar();
return 0;
}
如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decoratoro类就可以是ConcreteComponent的一个子类。
如果只有一个ConcreteDecorator类,那么就可以把Decorator和ConcreteDecorator的责任合并成一个类。
优点
:
- 把类中的装饰功能从类中搬出来,简化了原有的类。
- 可以有效地把类的核心职责和装饰功能区分开,去除重复的装饰逻辑。
- 可以在已有功能上动态添加功能,当包装好各装饰功能类时,就可以在执行特殊行为时,可以根据需要有选择地、按顺序地使用装饰功能包装对象