定义
动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活
继承添加新功能:使用继承是静态的,在编译的时候就已经决定了子类的行为,我们不便于控制增加行为的方式和时机。
关联添加新功能:B对象引用A对象,由B对象决定是否来扩展A对象的行为
关联不会破坏类的封装性,可以为类动态添加职责 、
模式架构
例子:
#include <iostream>
//公共接口
class Component {
public:
virtual void Operation() = 0;
};
//需要被装饰的对象
class ConcreteComponent :public Component {
public:
/*Operation代表每个类所有的操作*/
void Operation() {
cout<<"未被装饰前的对象"<<endl;
}
};
//装饰抽象基类
class Decorator : public Component {
protected:
Component*component;
public:
void SetComponent(Component*component) {
this->component = component;//设置需要装饰的对象
}
void Operation() {
if(component!=NULL)
component->Operation();//在装饰好的对象中添加装饰前对象的功能
}
};
//装饰A类
class ConcreteDecoratorA : public Decorator {
public:
//装饰A类特有的装饰方法
void Operation() {
//首先调用被装饰者原来特有的操作
Decorator::Operation();
cout<<"增加A装饰(操作)"<<endl;
}
};
//装饰B类
class ConcreteDecoratorB : public Decorator {
public:
//装饰B类特有的装饰方法
void Operation() {
//首先调用被装饰者原来特有的操作
Decorator::Operation();
cout<<"增加B装饰(操作)"<<endl;
}
//装饰B类独有的方法
void FuncB() {
cout<<"这是装饰B类独有的方法"<<endl;
}
};
void main(void) {
//实例化一个需要被装饰的对象
ConcreteComponent *c = new ConcreteComponent();
//A种装饰
ConcreteDecoratorA *A = new ConcreteDecoratorA();
//B种装饰
ConcreteDecoratorB *B = new ConcreteDecoratorB();
//为被装饰者c增加A种装饰
A->SetComponent(c);
A->Operation();//此时c具有了A功能
cout<<endl<<endl;
//为c再增加B种装饰
B->SetComponent(A);
//c经过两种装饰后得到最终的B,这有就意味着现在的Operation()函数同时具备A,B,c三者个Operation的功能
B->Operation();
}