装饰模式
这里只讲一些理论上的东西,实现将会在接下来几篇文章具体展开,有兴趣,可以一起研究讨论吖!!!下面进入正题。
定义:动态地给对象添加一些额外的功能且不改变其结构。就增加功能这一点,装饰模式要比增加子类灵活。
接下来看下装饰模式的结构图:
模块大概代码如下:
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
class component{
public:
virtual void Operation() = 0 ;
};
class ConcreteComponent: public component{
public:
virtual void Operation(){
cout<<"具体操作的对象"<<endl;
}
};
class Decorate : public component{
protected:
component* Component;
public:
void SetComponent(component* component){
this->Component = component;
}
virtual void Operation(){
if(Component!=NULL){
Component->Operation();
}
}
};
class ConcreteDecorateA : public Decorate{
private:
string addState;
public:
virtual void Operation(){
Decorate::Operation();
addState = "ConcreteDecorateA";
cout<<addState<<endl;
}
};
class ConcreteDecorateB : public Decorate{
private:
void AddState(){
cout<<"ConcreteDecorateB"<<endl;
}
public:
virtual void Operation(){
Decorate::Operation();
AddState();
}
};
int main(){
ConcreteComponent* c = new ConcreteComponent;
ConcreteDecorateA* d1 = new ConcreteDecorateA;
ConcreteDecorateB* d2 = new ConcreteDecorateB;
d1->SetComponent(c);
d2->SetComponent(d1);
d2->Operation();
}
//输出如下:
//具体操作的对象
//ConcreteDecorateA
//ConcreteDecorateB
装饰模式通过利用SetComponent来使得对象进行包装,这样每个装饰对象的实现就和如何使用这个对象分开,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
总结
装饰模式为已有功能动态的增加新的功能。它将每个要装饰的功能放在独立的类中, 并让这个类包装它要装饰的对象,因此,当需要执行特殊的行为时,客户代码就可以在运行时根据需要选择性,顺序性装饰功能包装对象。
但缺点就是多层装饰使用起来相对比较复杂。
来源:CSDN
作者:甜甛恬栝湉铦i
链接:https://blog.csdn.net/ts596705957/article/details/104696207