装饰模式(Decorator)---对象结构型模式

意图:动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
结构:
这里写图片描述

Component —定义一个对象接口,可以给需要装饰的对象动态的添加职责。
ConcreteComponent —定义一个对象,并对该对象进行装饰(或者添加一些职责)。
Decorator — 维持一个指向Component 的指针,并定义一个与Component 接口一致的接口。
ConcreteDecorator — 添加职责。
Decorator 将请求发送给Component 对象,然后由 Component 指针指向的对象执行相应的操作。

代码:

#include<iostream>
using namespace std;
class Component
{
public:
    virtual void Operation() = 0;
};
class ConcreteComponent : public Component
{
public:
    virtual void Operation()
    {
        cout << "I am no decoratored ConcreteComponent" << endl;
    }
};
class Decorator : public Component
{
public:
    Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}
    virtual void Operation()
    {
        if (m_pComponentObj != NULL)
        {
            m_pComponentObj->Operation();
        }
    }
protected:
    Component *m_pComponentObj;
};
class ConcreteDecoratorA : public Decorator
{
public:
    ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
    virtual void Operation()
    {
        Decorator::Operation();
        AddedBehavior();
    }
    void  AddedBehavior()
    {
        cout << "This is added behavior A." << endl;
    }
};
class ConcreteDecoratorB : public Decorator
{
public:
    ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
    virtual void Operation()
    {
        Decorator::Operation();
        AddedBehavior();    
    }
    void  AddedBehavior()
    {
        cout << "This is added behavior B." << endl;
    }
};

int main()
{
    Component *pComponentObj = new ConcreteComponent();
    Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
    Decorator *pDecoratorB1jb = new ConcreteDecoratorB(pDecoratorAOjb);
    pDecoratorB1jb->Operation();
    cout << "=============================================" << endl;
    Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
    pDecoratorBOjb->Operation();
    cout << "=============================================" << endl;
    Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
    pDecoratorBAOjb->Operation();
    cout << "=============================================" << endl;

    delete pDecoratorBAOjb;
    pDecoratorBAOjb = NULL;
    delete pDecoratorBOjb;
    pDecoratorBOjb = NULL;
    delete pDecoratorB1jb;
    pDecoratorB1jb = NULL;
    delete pDecoratorAOjb;
    pDecoratorAOjb = NULL;
    delete pComponentObj;
    pComponentObj = NULL;

    getchar();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值