案例分析:
我们去超市买东西,会收到购物小票,上面是你购买的物品名称、数量、单价及总价等信息,以及购物时间,收银员号码等最基本的信息,这些是基本不变的。不过有时超市还会在这张票据的上面或下面打印其他信息,例如:欢迎辞、促销广告等,而且这些信息的内容及打印位置也不固定,相当于是对购物小票的额外装饰了。
意图:
为一个对象动态连接附加的指责。根据案例,本程序可为购物小票动态添加各种抬头和注释。
描述:
装饰模式是一种对象结构型模式,这种模式主要用于对象
结构图:

程序代码:
#include <iostream.h>
class cxiaopiao
{
public:
virtual void DaYinXiaoPiao()=0;
};
class cjutixiaopiao:public cxiaopiao
{
public:
void DaYinXiaoPiao()
{
cout<<"票据正文"<<endl;
}
};
class czhuangshixiaopiao:public cxiaopiao
{
protected:
cxiaopiao* xpobj;
public:
czhuangshixiaopiao(cxiaopiao* obj)
{
xpobj=obj;
}
virtual void DaYinXiaoPiao()=0;
};
class header1xiaopiao:public czhuangshixiaopiao
{
public:
header1xiaopiao(cxiaopiao* obj):czhuangshixiaopiao(obj){}
void DaYinXiaoPiao()
{
cout<<"抬头1"<<endl;
xpobj->DaYinXiaoPiao();
}
};
class header2xiaopiao:public czhuangshixiaopiao
{
public:
header2xiaopiao(cxiaopiao* obj):czhuangshixiaopiao(obj){}
void DaYinXiaoPiao()
{
cout<<"抬头2"<<endl;
xpobj->DaYinXiaoPiao();
}
};
class footer1xiaopiao:public czhuangshixiaopiao
{
public:
footer1xiaopiao(cxiaopiao* obj):czhuangshixiaopiao(obj){}
void DaYinXiaoPiao()
{
xpobj->DaYinXiaoPiao();
cout<<"脚注1"<<endl;
}
};
class footer2xiaopiao:public czhuangshixiaopiao
{
public:
footer2xiaopiao(cxiaopiao* obj):czhuangshixiaopiao(obj){}
void DaYinXiaoPiao()
{
xpobj->DaYinXiaoPiao();
cout<<"脚注2"<<endl;
}
};
int main()
{
czhuangshixiaopiao* xiaopiao=new header1xiaopiao(new footer2xiaopiao(new footer1xiaopiao(new cjutixiaopiao)));
xiaopiao->DaYinXiaoPiao();
cout<<endl;
xiaopiao=new header1xiaopiao(new header2xiaopiao(new footer1xiaopiao(new footer2xiaopiao (new cjutixiaopiao))));
xiaopiao->DaYinXiaoPiao();
return 0;
}
运行结果:
抬头1
票据正文
脚注1
脚注2
抬头1
抬头2
票据正文
脚注2
脚注1
Press any key to continue