装饰模式----C++实现

来源:互联网 发布:网络保密承诺书样本 编辑:程序博客网 时间:2024/04/28 11:39

装饰模式

定义:

动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

适用性:

1、  在不影响其他对象的情况下,以动态,透明的方式给单个对象添加职责。

2、  处理那些可以撤销的职责

3、  当不能采用生成子类的方法扩充是。

 

优点:

1、  比静态继承更灵活

2、  避免在层次结构高层的类有太多的特征

 

结构:

实现:

class Component

{

public:

       Component(){};

       virtual~Component(){};

    virtual void doSomething() = 0;

};

 

class A:public Component

{

public:

       voiddoSomething(){}

protected:

private:

};

 

class ConcreteComponent:public Component

{

public:

       ConcreteComponent(){}

       ~ConcreteComponent(){}

       voiddoSomething()

       {

              cout<<"ConcreteComponent doSomething"<<endl;

       }

};

 

class Decorator:public Component

{

public:

       Decorator(Component*pcomponent):m_pComponent(pcomponent)

       {  }

       ~Decorator(){}

       //直接调用被装饰组件

       voiddoSomething()

       {

              m_pComponent->doSomething();

       }

private:

       Component *m_pComponent;

};

//给ConcreteComponent添加了额外的状态

class ConcreteDecoratorA:public Decorator

{

public:

    ConcreteDecoratorA(Component*pcomponent,string name):Decorator(pcomponent),m_name(name)

       { }

       ~ConcreteDecoratorA(){}

       voiddoSomething()

       {

              cout<<"ConcreteComponent name :"<<m_name<<endl;

              Decorator::doSomething();

       }

private:

       //额外的状态

       string m_name;

};

//给ConcreteComponent添加了额外的操作

class ConcreteDecoratorB:public Decorator

{

public:

       ConcreteDecoratorB(Component*pcomponent):Decorator(pcomponent)

       { }

       ~ConcreteDecoratorB(){}

       voiddoSomething()

       {

              doAdditionalThing();

              Decorator::doSomething();

       }

private:

       //额外的职责

       voiddoAdditionalThing()

       {

              cout<<"ConcreteDecoratorB doAdditionalThing "<<endl;

       }

};

 

       Component *pcom = new ConcreteComponent;

       Decorator *pa = newConcreteDecoratorA(pcom,"componentA");

       Decorator *pb = newConcreteDecoratorB(pcom);

       pa->doSomething();

       pb->doSomething();

实现中最重要的一点就是,装饰对象和被装饰的组件的接口是一致的。如果有多个装饰类,则所有的装饰类必须有一个公共的父类。

 

0 0