美文网首页
设计模式-结构模式-装饰模式

设计模式-结构模式-装饰模式

作者: 阿棍儿_Leon | 来源:发表于2020-04-28 22:05 被阅读0次

    装饰模式可以不修改核心类而做到对类进行扩展。这里的装饰是指为一个动作前和后增加额外的行为。
    假如一个类实现了某个抽象方法,我们想对这个类的这个方法进行扩展,那么我们可以用一个装饰器类也实现这个方法,但是在这个实现中要调用前面那个对象的这个方法,在这个调用前后,可以添加装饰的逻辑。这样做之后,当我们希望对那个类的对象调用带有装饰的版本时,只要调用这个对象的装饰器实例的同名方法即可。
    另外,装饰器对象和被装饰的对象都是同一个抽象类的子类,那就意味着装饰器本身也可以被装饰,即装饰时可以嵌套的。

    以下代码定义了装饰对象和被装饰对象的抽象类,Operation函数是待装饰的。

    #include <iostream>
    
    using namespace std;
    
    class Component
    {
    public:
        virtual ~Component(){}
        virtual void Operation(void)=0;
    };
    

    以下代码定义了待装饰的类。

    class ConcreteComponent:public Component
    {
    public:
        void Operation(void)
        {
            cout<<__PRETTY_FUNCTION__<<endl;
        }
    };
    

    以下代码定义了装饰器基类,被装饰类的方法在这里被调用。

    class Decorator:public Component
    {
    private:
        Component* m_pComponent;
    public:
        Decorator(Component* component):m_pComponent(component){}
        void Operation(void)
        {
            m_pComponent->Operation();
        }
    };
    

    以下代码定义了两个装饰器,在父类方法之外加了一句装饰。

    class Decorator0:public Decorator
    {
    public:
        Decorator0(Component* component):Decorator(component){}
        void Operation(void)
        {
            cout<<__PRETTY_FUNCTION__<<"->";
            Decorator::Operation();
        }
    };
    class Decorator1:public Decorator
    {
    public:
        Decorator1(Component* component):Decorator(component){}
        void Operation(void)
        {
            cout<<__PRETTY_FUNCTION__<<"->";
            Decorator::Operation();
        }
    };
    

    以下代码演示的装饰以及嵌套装饰。
    首先创建一个待装饰的对象,然后用此对象创建第一层装饰器,并测试装饰结果。
    后面再用第一层装饰器对象创建了第二层装饰器,并测试装饰结果。

    int main(void){
        Component* component = new ConcreteComponent();
        Decorator* decorator0 = new Decorator0(component);
        decorator0->Operation();
        Decorator* decorator1 = new Decorator1(decorator0);
        decorator1->Operation();
        delete decorator1;
        delete decorator0;
        delete component;
        return 0;
    }
    

    输出

    virtual void Decorator0::Operation()->virtual void ConcreteComponent::Operation()
    virtual void Decorator1::Operation()->virtual void Decorator0::Operation()->virtual void ConcreteComponent::Operation()
    

    相关文章

      网友评论

          本文标题:设计模式-结构模式-装饰模式

          本文链接:https://www.haomeiwen.com/subject/qbhiwhtx.html