代码
基于Qt5.9+mingw32
#include <QCoreApplication>
#include <QList>
#include <QDebug>
//装饰者模式的例子--20180910
///装饰者模式的基本用途是用于任意组合对象,就像三明治的制作过程一样
//装饰者模式的原理跟观察者也一样是面向对象的运行时类型识别特性,将每个组件类都留下接口给其它组件
//在真正构造时就能用该接口进行组装,典型的装饰者模式的用途就是字符流的函数(如oparator(<<))
//首先构造一个组件接口,包含纯虚函数用以实现这一组件的待组装功能
class Thing
{
protected:
Thing() {}
public:
virtual ~Thing() {}
virtual void make() = 0;//所有派生组件类的待拼装功能
};
//组件类1
class Coffee: public Thing
{
private:
Thing *food;//留给其它组件的接口
public:
Coffee(): Thing() {}
Coffee(Thing* food)//这个构造函数可以添加其它组件在本组件上
{
this->food = food;
}
protected:
virtual void make()//本组件功能要加上其它连接在这个组件上的功能
{
qDebug() << "coffee ";
food->make();
}
};
//组件类2-同1
class Sugar: public Thing
{
private:
Thing *food;
public:
Sugar(): Thing() {}
Sugar(Thing* food)
{
this->food = food;
}
protected:
virtual void make()
{
qDebug() << "sugar ";
food->make();
}
};
int main(int, char **)
{
///装饰者模式测试
Thing *thing = new Coffee(new Sugar(new Sugar(new Sugar(new Sugar(new Sugar(new Coffee(new Coffee(new Coffee()))))))));
thing->make();//用带组件接口的构造函数来组合一系列组件,然后调用这个组合后的大组件的功能函数
qDebug() << "\r\n";
getchar();
delete thing;
}