zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    Meteor会话
    Meteor事件
    Meteor表单
    Meteor集合
    Meteor模板
    Visual Studio 必备神器
    DB2 DATE类型在显示的时候,带有00:00:00,去掉的方法,使用VARCHAR()函数
    SQL 递归查询
    程序员最艰巨的十大任务
    Windows 7,64位机器上安装DB2 7.2+FP7
  • 原文地址:https://www.cnblogs.com/kex1n/p/2286537.html
Copyright © 2011-2022 走看看