装饰模式(Decorator)

来源:互联网 发布:文言文虚词乎 编辑:程序博客网 时间:2024/04/30 23:55
意图
动态的给一个对象添加一些额外的职责。
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. 装饰模式可以使你在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责