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

  • 相关阅读:
    React源码深度解析视频 某课网(完整版)
    解决VueRoter/element-ui路由报错Error: Avoided redundant navigation to current location的问题
    package-lock.json的作用
    encodeURI()和encodeURIComponent() 区别
    Webpack HMR 原理解析
    Kibana详细入门教程
    大数据可视化(万物互联)
    ES11来了,有些新特性还是值得一用的!
    Prometheus(普罗米修斯)——适合k8s和docker的监控系统
    linux安装pm2
  • 原文地址:https://www.cnblogs.com/kex1n/p/2286537.html
Copyright © 2020-2023  润新知