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;
}

posted @ 2009-06-04 11:02  小 楼 一 夜 听 春 雨  阅读(263)  评论(0编辑  收藏  举报