转自 https://www.cnblogs.com/wrbxdj/p/5259742.html
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
Component
——定义一个对象接口,可以给这些对象动态的添加职责。
ConcreteComponent
——定义一个对象,可以给这个对象添加一些职责。
Decorator
——维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。
ConcreteDecorator
——向组件添加职责。
#include <iostream>
#include <list>
using namespace std;
// 打印一行表格代码
void print(char* str)
{
cout<<"├───────────────────────────────"<<endl
<<"│"<<str<<":"<<endl;
}
// 定义一个抽象基类absTable(Component)
class absTable
{
public:
virtual void putTable() = 0;
};
// 定义具体的表格absTable(ConcreteComponent)
class BaseTable:public absTable
{
public:
virtual void putTable()
{
print("姓名");
print("性别");
print("学历");
print("年龄");
cout<<"└───────────────────────────────"<<endl;
}
};
// 定义抽象Decorator
class Decorator:public absTable
{
public:
Decorator(absTable* concrateTb):mpAbsTable(concrateTb){}
virtual void putTable()
{
mpAbsTable->putTable();
}
private:
absTable* mpAbsTable;
};
// 定义具体的装饰EnglishDcrt、CurWage、Experience(ConcreteDecoratorA、B、C)
class EnglishDcrt:public Decorator
{
public:
EnglishDcrt(absTable* pTb):Decorator(pTb){}
virtual void putTable()
{
print("英语等级");
Decorator::putTable();
}
};
class CurWage:public Decorator
{
public:
CurWage(absTable* pTb):Decorator(pTb){}
virtual void putTable()
{
print("当前薪水");
Decorator::putTable();
}
};
class Experience:public Decorator
{
public:
Experience(absTable* pTb):Decorator(pTb){}
virtual void putTable()
{
print("项目经验");
Decorator::putTable();
}
};
// 动态的给一个对象添加一些额外的职责!
// 层层包装,增强功能。这就是装饰模式的要旨!
// 接口稳定不变!
void main()
{
BaseTable pro1;
cout<<"初始表格:"<<endl<<endl;
pro1.putTable();
cout<<"新表格1:"<<endl<<endl;
EnglishDcrt eng(&pro1);
eng.putTable();
cout<<"新表格2:"<<endl<<endl;
CurWage wg(&eng);
wg.putTable();
cout<<"新表格3:"<<endl<<endl;
Experience ex(&wg);
ex.putTable();
}