设计模式-结构模式-装饰模式
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()