Decorator(装饰、油漆工)--对象结构型模式

#ifndef DECORATOR_H_
#define DECORATOR_H_

#include "iostream"
using namespace std;

/* 接口的一致性:装饰对象的接口必须和他所装饰的Component的接口
   是一致的。因此,所有的ConcreteDecorator类必须有一个公共的接口
*/

// 抽象基类定义一个对象接口,可为这个接口动态的添加职责
class Component
{
public:
    Component() {}
    virtual ~Component() {}
   
    // 纯虚函数
    virtual void operation() = 0;
};


// 抽象基类,维护一个指向Componetn的指针
class Decorator : public Component
{
public:
    Decorator(Component* pnt):cpnt_(pnt) {}
    virtual ~Decorator()
    {
        delete cpnt_;
        cpnt_ = 0;
    }

protected:
    Component* cpnt_; // Component的指针
};


// 需要被动态添加职责的类
class ConcreateComponent: public Component
{
public:
    ConcreateComponent() {}
    virtual ~ConcreateComponent() {}

    virtual void operation()
    {
        cout<<"operation of concreate component!"<<endl;
    }
};


// 派生在Decorator,为ConcreateComponent动态添加职责的类
class ConcreateDecorator : public Decorator
{
public:
    ConcreateDecorator(Component* pont):Decorator(pont) {}
    virtual ~ ConcreateDecorator() {}

    // 动态添加职责在此处实现
    virtual void operation()
    {
        // 把请求转发给component对象,并在转发前后执行额外的操作。
        cpnt_->operation();
        add_behavior();
    }

private:
    void add_behavior()
    {
        cout<<"add behavior!"<<endl;
    }
};

#endif


#include "Decorator.h"

int main()
{
    // 初始化一个Component对象
    Component* pt = new ConcreateComponent;
   
    // 用Component对象去初始化一个Decorator对象,
    // 这样就可以为这个Component对象动态添加职责了

    // 当想对对象进行动态添加不同的职责的时候,只需要
    // 生成不同的Decorator的子类对象,把被装饰的对象组件
    // 放到这个子类对象中即可。可以连续把被装饰的对象放进一个或者
    // 多个Decorator的子类中去完成不同的装饰
    Decorator* dr = new ConcreateDecorator(pt);

    // 调用Decorator的接口进行添加职责
    dr->operation();
   
    delete dr;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值