设计模式-decorator 演示程序

power4 2003-10-20 06:34:36
////////////////////////////////////////
// Decorator.cpp
//装饰类模式演示程序,
//2003-10-16 zhj create
/////////////////////////////////////////
//Note
//1)装饰类可以装饰任何从抽象类派生的,实现了抽象类接口的类(装饰类没有实现抽象类接口,
//如本例,decoOut及其子类都没有实现TextOut接口,所以不能修饰decoOut及其派生类,也就是说
//装饰类不能装饰自身)
//2)模式在于“神”而不在于“形”,散文在于“形散而神不散”,模式同样如此。理解了某一个模式,
//写出10个concrete implmentataion,10个都会不同,总之,多多练习。
//3)随手写成,没经过大脑,例子选得不好,命名也不好,里面还有几个用1234标识的对象,
//不好意思。我个人理解,这个模式使用得比较广的。
//4)此例子对高手不适用,恳请高手提出意见。
/////////////////////////////////////////
//author
//msn:topower4@hotmail.com
//希望同c++,linux,arm(偏软件的),qt爱好者交流。

//////////////////////////////////////////
//
#include "iostream.h"

/////////////////////////////
//接口,抽象类
class visualOut
{
public:
virtual void TextOut(void)=0;
protected:
visualOut(){};
};
/////////////////////////////////////
//基本类
class basicOut:public visualOut
{
public:
basicOut(){};
virtual void TextOut(void)
{
cout<<"basicOut"<<endl;
}
};
///////////////////////////////////////
//基本类的子类,同样可以增加功能
class inherBasicOut:public basicOut
{
public:
inherBasicOut(){};
virtual void TextOut(void)
{
cout<<"basicOut+inherBasicOut"<<endl;
}
};
////////////////////////////
//装饰类
class decoOut:public visualOut
{
public:
decoOut(visualOut * p)
{
mpVisualOut=p;
}
virtual void TextOut(void)
{
mpVisualOut->TextOut();
}
private:
visualOut * mpVisualOut;
//组合了接口,由concrete decorator的构造函数来对其赋值。
};
////////////////////////////
//Concrete装饰类1
class ex1decoOut:public decoOut
{
public:
ex1decoOut(visualOut * p):decoOut(p)
{}
virtual void TextOut(void)
{
decoOut::TextOut();
cout<<"装饰了ex1"<<endl;
}
};
//////////////////////////////
//Concrete装饰类2
class ex2decoOut:public decoOut
{
public:
ex2decoOut(visualOut *p)
:decoOut(p)
{}

virtual void TextOut(void)
{
decoOut::TextOut();
cout<<"装饰了ex2"<<endl;
}
};
/////////////////////////////
//测试函数,调用接口visualOut
class CTest
{
public:
CTest(){};
fOut(visualOut* pOut)
{
pOut->TextOut();
}
};
///////////////////////////
//
int main(int argc, char* argv[])
{

CTest* pTest=new CTest;
if (NULL==pTest) {
cout<<"error"<<endl;
return 0;
}
//虚拟类指针
visualOut *pvisualOut;
//基本类输出
cout<<"**********基本类的输出**********************************"<<endl;
basicOut mbasicOut;
pvisualOut=&mbasicOut;
pTest->fOut(pvisualOut);

//基本类的子类(扩展了基本类的功能)的输出
cout<<"**********基本类的子类扩展了基本类**********************"<<endl;
inherBasicOut minherBasicOut;
pvisualOut=&minherBasicOut;
pTest->fOut(pvisualOut);

//
cout<<"**********装饰类装饰了基本类****************************"<<endl;
ex2decoOut mex2decoOut(&mbasicOut);
//Conrete类的对象组合了其要装饰的类(这里是basicOut),这个组合是有Conrete的父类
//decoOut来实现的。
pvisualOut=&mex2decoOut;
pTest->fOut(pvisualOut);
//客户用同样的接口调用,但是实现基本功能(basicOut)+扩展功能(ex2decoOut)
//
cout<<"**********装饰类装饰了基本类的子类**********************"<<endl;
ex1decoOut mex1decoOut(&minherBasicOut);
pvisualOut=&mex1decoOut;
pTest->fOut(pvisualOut);
//
cout<<"**********多个不同的装饰类装饰了基本类******************"<<endl;
ex2decoOut mex2decoOut2(&mbasicOut);
ex1decoOut mex1decoOut2(&mex2decoOut2);
// ex1decoOut mex1decoOut2(&mex2decoOut2(&mbasicOut));//error
pvisualOut=&mex1decoOut2;
pTest->fOut(pvisualOut);

//
cout<<"**********多个相同的装饰类装饰了基本类******************"<<endl;
ex2decoOut mex2decoOut3(&mbasicOut);
ex2decoOut mex2decoOut4(&mex2decoOut3);
pvisualOut=&mex2decoOut4;
pTest->fOut(pvisualOut);

//不要装饰了,回收,实际上mbasicOut对象根本没改变过
cout<<"**********回收装饰类************************************"<<endl;
pvisualOut=&mbasicOut;
pTest->fOut(pvisualOut);

return 0;
}
...全文
48 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
leyt 2003-10-28
  • 打赏
  • 举报
回复
有点晕 一会儿再看
Tonyfengliang 2003-10-27
  • 打赏
  • 举报
回复
看不太懂哦!
Andy84920 2003-10-21
  • 打赏
  • 举报
回复
到底哪一本是设计模式?能给个图书链接吗?
是不是设计新思维那本?
liushmh 2003-10-21
  • 打赏
  • 举报
回复
完全按照decorator的uml图写的
fengfeng2003 2003-10-20
  • 打赏
  • 举报
回复
有收获,多谢!
Jinhao 2003-10-20
  • 打赏
  • 举报
回复
头晕了~~
ZhangChengGang 2003-10-20
  • 打赏
  • 举报
回复
good

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧