首页 > 代码库 > 设计模式-装饰者模式

设计模式-装饰者模式

装饰者模式

    在OO设计和开发过程,当我们需要为一个已经定义好的类添加新的职责(操作),通常情况下我们会采用继承的方式定义好自己的类,但是采取这样的方式会带来一些问题。

   为了多态,通过父类指针指向其具体子类,但是这会造成另一问题:当我们需要为子类添加新的职责,就必须向其父类添加一个这个功能的抽象接口,否则通过父类指针无法调用这个方法了。这样处于高层的父类就含有太多的的方法,并且继承自这个父类的所有子类都不可避免继承了父类的这些接口,但是这些可能并不是所有子类所需要的。

为此我们采用组合的方式而不是继承方式,当需要添加一个操作的时候就可以通过Decorator模式来解决。装饰模式通过一个包装对象,以对客户端透明的方式动态地给一个对象附加上更多的责任。

     

装饰者模式的角色:

       抽象构件角色(Component):给出一个抽象接口,以规范准备接受附加责任的对象.

       具体构件角色(Concrete Component):定义将要接受附加责任的类.

       装饰角色(Decorator):持有一个构件(Component)对象的引用,并定义一个与抽象接口一致的接口.

       具体装饰角色(Concrete Decorator):负责给构件对象添加附加的责任.

 

装饰者模式典型结构图:

       

 

 

装饰者模式的程序实例:

     

#include <iostream>#include <string>using namespace std;//抽象构件class Component{public:     Component(){};     ~virtual Component(){};      virtual void doSomething()=0;};//具体构件class ConcreteComponentA:public Component{public:     ConcreteComponentA(){}     ~ConcreteComponentA(){}          void doSomething(){          cout<<"功能A"<<endl;      }};

class ConcreteComponentB:public Component{public:     ConcreteComponentB(){}     ~ConcreteComponentB(){}          void doSomething(){          cout<<"功能B"<<endl;      }};

//装饰者角色 class Decorator:public Component{
    public: 
Decorator(Component
* com){ _com=com; }
~Decorator(){ delete _com; }

void doSomething(){
_com->doSomething();
    }    };//具体装饰者角色class ConcreteDecorator:public Decorator{public:     ConcreteDecorator(Component* com):Decorator(com){}     ~ConcreteDecorator();          void doSomething(){            Decorator::doSomething();            doAnotherthing();     }private:     void doAnotherthing(){          cout<<"功能C"<<endl;    }};

 

 

 

采用这样的方式我们可以通过ConcreteDecorator的构造函数来确定传递某个具体的ConcreteComponent类.

例如此例:

       ConcreteDecorator* pA=new ConcreteDecorator(new ConcreteComponentA()) 或者

                                                                            new ConcreteComponentB();

 

  通过这种方式只要是Component型别的对象都可以提供修饰操作的类,这样就算我们新建了100个Component型别的类ConcreteComponent,也都可以由Decorator一个类搞定.而这也正是Decorator模式的关键所在.

                           

                                                                                                                                

 

设计模式-装饰者模式