设计模式-装饰模式

一世执手 提交于 2020-03-07 21:03:03

装饰模式

这里只讲一些理论上的东西,实现将会在接下来几篇文章具体展开,有兴趣,可以一起研究讨论吖!!!下面进入正题。


定义:动态地给对象添加一些额外的功能且不改变其结构。就增加功能这一点,装饰模式要比增加子类灵活。


接下来看下装饰模式的结构图:
在这里插入图片描述


模块大概代码如下:

#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
class component{
 public:
  virtual void Operation() = 0 ;
};
class ConcreteComponent: public component{
 public:
  virtual void Operation(){
   cout<<"具体操作的对象"<<endl;
  }
};
class Decorate : public component{
 protected:
  component* Component;
 public:
  void SetComponent(component* component){
   this->Component = component;
  }
  virtual void Operation(){
   if(Component!=NULL){
    Component->Operation();
   }
  }
  
};
class ConcreteDecorateA : public Decorate{
 private:
  string addState;
 public:
  virtual void Operation(){
   Decorate::Operation();
   addState = "ConcreteDecorateA";
   cout<<addState<<endl;
  }
};
class ConcreteDecorateB : public Decorate{
 private:
  void AddState(){
   cout<<"ConcreteDecorateB"<<endl;
  }
 public:
  virtual void Operation(){
   Decorate::Operation();
   AddState();
  }
};
int main(){
 ConcreteComponent* c = new ConcreteComponent;
 ConcreteDecorateA* d1 = new ConcreteDecorateA;
 ConcreteDecorateB* d2 = new ConcreteDecorateB;
 d1->SetComponent(c);
 d2->SetComponent(d1);
 d2->Operation();
}
//输出如下:
//具体操作的对象
//ConcreteDecorateA
//ConcreteDecorateB

装饰模式通过利用SetComponent来使得对象进行包装,这样每个装饰对象的实现就和如何使用这个对象分开,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。


总结

装饰模式为已有功能动态的增加新的功能。它将每个要装饰的功能放在独立的类中, 并让这个类包装它要装饰的对象,因此,当需要执行特殊的行为时,客户代码就可以在运行时根据需要选择性,顺序性装饰功能包装对象。
缺点就是多层装饰使用起来相对比较复杂

下面还有几个例子:
实现一
实现二
实现三

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!