c++设计模式之装饰者模式

时间:2022-10-01 21:37:21

#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();

}

 

c++设计模式之装饰者模式