#include <IOSTREAM.H>
//公共接口
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();
}