现在的位置: 首页 > 综合 > 正文

装饰模式(Decorator)

2013年09月08日 ⁄ 综合 ⁄ 共 1598字 ⁄ 字号 评论关闭

意图

动态的给一个对象添加一些额外的职责。
Decorator模式添加功能比生成子类更为灵活。

类图

参与者
  • Component

    定义一个对象接口,可以给这些对象动态地添加职责
  • ConcreteComponent

    定义一个对象,可以个这个对象添加一些职责
  • Decorator

    维持一个指向Component对象的指针,并定义一个与Component的接口一致的接口
  • ConcreteDecorator

    向组件添加职责
代码

#include <iostream>

#include <string>
using namespace std;
class Component

{
public:

    virtual void Operation() = 0;

};
class ConcreteComponent:public Component

{
public:

    void Operation()

    {

        cout<<"具体对象的操作 ConcreteOp"<<endl;

    }

};
class Decorator:public Component

{
protected:

    Component *pComp;
public:

    void SetComponent(Component *pComp)

    {

        this->pComp = pComp;

    }

    void Operation()

    {

        if(pComp != NULL)

        {

            pComp->Operation();

        }    

    }

};

class ConcreteComponentA:public Decorator

{
private:

    string addState; //添加的新状态
public:

    ConcreteComponentA(string state)

    {

         this->addState = state;

    }

    void Operation()

    {

        Decorator::Operation();//调用父类方法

        cout<<"A 装饰类: "<<endl;

        cout<<"添加了的新状态: "<<this->addState<<endl;

    }

};
class ConcreteComponentB:public Decorator

{
private:

    string addState; //添加的新状态

    void AddedOperation()

    {

        cout<<"添加了的新职责BFun"<<endl;

    }
public:

    void Operation()

    {

        Decorator::Operation();//调用父类方法

        cout<<"B 装饰类:"<<endl;

        AddedOperation();

    }

};
int main()

{

     ConcreteComponent *pConComp = new ConcreteComponent();

     ConcreteComponentA *pConCompA = new ConcreteComponentA("Astate");

     ConcreteComponentB *pConCompB = new ConcreteComponentB();


     pConCompA->SetComponent(pConComp);

     pConCompB->SetComponent(pConCompA);


     pConCompB->Operation();

}



Head First设计模式
  1. 运行时扩展,远比编译时期的继承威力大
  2. 装饰模式可以使你在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责

抱歉!评论已关闭.