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

  • 相关阅读:
    Jmeter实现dubbo接口压测案例
    Jmeter性能测试报告扩展
    Jmeter3.2源码编译环境搭建
    JMeter中添加dubbo相关插件异常问题解决
    JMeter3.0启动日志报错WARN
    JMeter关联的几种方式总结案例
    JMeter调试参数是否取值正确,调试正则提取的结果(log.info|log.error|print)
    jdk1.7更新visualvm插件
    如何自定义 maven中的archetype
    java提高篇(四)-----理解java的三大特性之多态
  • 原文地址:https://www.cnblogs.com/kex1n/p/2286537.html
Copyright © 2020-2023  润新知