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

2020-04-28  本文已影响0人  阿棍儿_Leon

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

以下代码定义了装饰对象和被装饰对象的抽象类,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()
上一篇下一篇

猜你喜欢

热点阅读