您的位置:首页 > 运维架构 > Linux

设计模式之装饰模式

2015-08-05 15:29 483 查看
装饰模式

动态地给一个对象添加一些额外的职责(不重要的功能,只是偶然一次要执行),就增加功能来说,装饰模式比生成子类更为灵活。建造过程不稳定,按正确的顺序串联起来进行控制。

GOOD:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功能),就会增加类的复杂度。装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。



举例:
#include <iostream>

 using namespace std;

//行为接口

 class Component

 {

 public:

      virtual void Operation() = 0;

 };

 //具体组件类(生成具体要装饰的对象)

 class ConcreteComponent : public Component

 {

 public:

      void Operation()

      {

           cout<<"I am not a decoratored ConcreteComponent"<<endl;

      }

 };

 //装饰类

 class Decorator : public Component

 {

 public:

      Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}

      void Operation()

      {

           if (m_pComponentObj != NULL)

           {

                m_pComponentObj->Operation();

           }

      }

 protected:

      Component *m_pComponentObj;

 };

//添加行为A的具体装饰类

 class ConcreteDecoratorA : public Decorator

 {

 public:

      ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}

      void Operation()

      {

           AddedBehavior();

           Decorator::Operation();

      }

      void  AddedBehavior()

      {

           cout<<"This is added behavior A."<<endl;

      }

 };

 //添加行为B的具体装饰类

 class ConcreteDecoratorB : public Decorator

 {

 public:

      ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}

      void Operation()

      {

           AddedBehavior();

           Decorator::Operation();

      }

      void  AddedBehavior()

      {

           cout<<"This is added behavior B."<<endl;

      }

 };

 int main()

 {

      Component *pComponentObj = new ConcreteComponent(); //具体要装饰的对象pObj

      Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj); //为pObj添加行为A

      pDecoratorAOjb->Operation();

      cout<<"============================================="<<endl;

      Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj); //为pObj添加行为B

      pDecoratorBOjb->Operation();

      cout<<"============================================="<<endl;

      Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb); //为pObj添加行为B和行为A

      pDecoratorBAOjb->Operation();

      cout<<"============================================="<<endl;

      delete pDecoratorBAOjb;

      pDecoratorBAOjb = NULL;

      delete pDecoratorBOjb;

      pDecoratorBOjb = NULL;

      delete pDecoratorAOjb;

      pDecoratorAOjb = NULL;

      delete pComponentObj;

      pComponentObj = NULL;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux c++ 设计模式