设计模式-装饰者模式

装饰者模式

    在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模式的关键所在.

                           

                                                                                                                                

 

posted @ 2014-12-07 20:18  晓风_7  阅读(502)  评论(0编辑  收藏  举报