cpp: Decorator Pattern
// DuControl.h: 此文件包含 "DuControl" 类。装饰器模式 Decorator Pattern C++ 14 // //装饰者模式、装饰器模式、Wrapper、Decorator Pattern // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef DUCONTROL_H #define DUCONTROL_H #include <iostream> #include <list> #include <map> using namespace std; namespace DuDecoratorPattern { /// <summary> /// 抽象的控件类 /// </summary> class DuControl { public: /// <summary> /// draw方法,用于将自身绘制到屏幕上 /// </summary> virtual void draw() //=0; { cout << "DuControl 自身绘制到屏幕上" << endl; }; public: /// <summary> /// 做父类时析构函数应该为虚函数 /// </summary> virtual ~DuControl() {} }; } #endif // DuControl.h: 此文件包含 "DuControl" 类。装饰器模式 Decorator Pattern C++ 14 // //装饰者模式、装饰器模式、Wrapper、Decorator Pattern // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef DULISTTRL_H #define DULISTTRL_H #include <iostream> #include <list> #include <map> #include "DuControl.h" using namespace std; namespace DuDecoratorPattern { /// <summary> /// 列表控件类 /// </summary> class DuListCtrl:public DuControl { public: /// <summary> /// 具体可以用DirectX或OpenGL来绘制 /// </summary> virtual void draw() { cout << "绘制普通的列表控件!" << endl; } }; } #endif // DuDecorator.h: 此文件包含 "DuDecorator" 类。装饰器模式 Decorator Pattern C++ 14 // //装饰者模式、装饰器模式、Wrapper、Decorator Pattern // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef DUDECOTRATOR_H #define DUDECOTRATOR_H #include <iostream> #include <list> #include <map> #include "DuControl.h" using namespace std; namespace DuDecoratorPattern { /// <summary> /// /// </summary> class DuDecorator :public DuControl { public: /// <summary> /// 构造函数 /// </summary> /// <param name="tmpctrl"></param> DuDecorator(DuControl* tmpctrl) :mcontrol(tmpctrl) {} /// <summary> /// 虚函数,调用的是哪个draw取决于m_control指向的对象 /// </summary> virtual void draw() { mcontrol->draw(); } private: /// <summary> /// 需要被装饰的其他控件,这里用的是父类指针Control * /// </summary> DuControl* mcontrol; }; } #endif // DuBorderDec.h: 此文件包含 "DuBorderDec" 类。装饰器模式 Decorator Pattern C++ 14 // //装饰者模式、装饰器模式、Wrapper、Decorator Pattern // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef DUBORDERDEC_H #define DUBORDERDEC_H #include <iostream> #include <list> #include <map> #include "DuControl.h" #include "DuDecorator.h" using namespace std; namespace DuDecoratorPattern { /// <summary> /// 具体的“边框”装饰器类 /// </summary> class DuBorderDec:public DuDecorator { public: /// <summary> /// 构造函数 /// </summary> /// <param name="tmpctrl"></param> DuBorderDec(DuControl* tmpctrl) :DuDecorator(tmpctrl) {} /// <summary> /// /// </summary> virtual void draw() { DuDecorator::draw(); //调用父类的draw方法以保持以往已经绘制出的内容 drawBorder(); //也要绘制自己的内容 } private: /// <summary> /// /// </summary> void drawBorder() { cout << "绘制边框!" << endl; } }; } #endif // VerScrollBarDec.h: 此文件包含 "VerScrollBarDec" 类。装饰器模式 Decorator Pattern C++ 14 // //装饰者模式、装饰器模式、Wrapper、Decorator Pattern // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef VERSCROLLBARDEC_H #define VERSCROLLBARDEC_H #include <iostream> #include <list> #include <map> #include "DuControl.h" #include "DuDecorator.h" using namespace std; namespace DuDecoratorPattern { /// <summary> /// 具体的“垂直滚动条”装饰器类 /// </summary> class VerScrollBarDec:public DuDecorator { public: /// <summary> /// 构造函数 /// </summary> /// <param name="tmpctrl"></param> VerScrollBarDec(DuControl* tmpctrl) :DuDecorator(tmpctrl) {} /// <summary> /// /// </summary> virtual void draw() { DuDecorator::draw(); //调用父类的draw方法以保持以往已经绘制出的内容 drawVerScrollBar(); //也要绘制自己的内容 } private: /// <summary> /// /// </summary> void drawVerScrollBar() { cout << "绘制垂直滚动条!" << endl; } }; } #endif // VerScrollBarDec.h: 此文件包含 "VerScrollBarDec" 类。装饰器模式 Decorator Pattern C++ 14 // //装饰者模式、装饰器模式、Wrapper、Decorator Pattern // 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit. #pragma once #ifndef HORSCROLLBARDEC_H #define HORSCROLLBARDEC_H #include <iostream> #include <list> #include <map> #include "DuControl.h" #include "DuDecorator.h" using namespace std; namespace DuDecoratorPattern { /// <summary> /// /// </summary> class HorScrollBarDec:public DuDecorator { public: /// <summary> /// 构造函数 /// </summary> /// <param name="tmpctrl"></param> HorScrollBarDec(DuControl* tmpctrl) :DuDecorator(tmpctrl) {} /// <summary> /// /// </summary> virtual void draw() { DuDecorator::draw(); //调用父类的draw方法以保持以往已经绘制出的内容 drawHorScrollBar(); //也要绘制自己的内容 } private: /// <summary> /// /// </summary> void drawHorScrollBar() { cout << "绘制水平滚动条!" << endl; } }; } #endif // GeovinDu.cpp : 此文件包含 "GeovinDu" 类。 //装饰者模式、装饰器模式、Wrapper、Decorator Pattern // 2023年5月18日 涂聚文 Geovin Du Visual Studio 2022 edit. #include "GeovinDu.h" #include "DuBorderDec.h" #include "DuControl.h" #include "DuDecorator.h" #include "DuListCtrl.h" #include "HorScrollBarDec.h" #include "VerScrollBarDec.h" using namespace std; namespace DuDecoratorPattern { /// <summary> /// /// </summary> void GeovinDu::displayDecoratorSimple() { //(1)创建一个又带边框,又带垂直滚动条的列表控件 //首先绘制普通的列表控件 DuDecoratorPattern::DuControl* plistctrl = new DuDecoratorPattern::DuListCtrl(); //plistctrl->draw(); //这里先不绘制了 //接着“借助普通的列表控件”,可以通过边框装饰器绘制出一个“带边框的列表控件” DuDecoratorPattern::DuDecorator* plistctrl_b = new DuDecoratorPattern::DuBorderDec(plistctrl); //注意形参,是普通列表控件,这里类型用Control *而不用Decorator *也是可以的 //plistctrl_b->draw(); //接着“借助带边框的列表控件”,可以通垂直滚动条装饰器绘制出一个“带垂直滚动条又带边框的列表控件” DuDecoratorPattern::DuDecorator* plistctrl_b_v = new DuDecoratorPattern::VerScrollBarDec(plistctrl_b); //注意形参,是带边框的列表控件 plistctrl_b_v->draw(); //这里完整最终绘制 cout << "-------------------------------" << endl; //(2)创建一个只带水平滚动条的列表控件 //首先绘制普通的列表控件 DuDecoratorPattern::DuControl* plistctrl2 = new DuDecoratorPattern::DuListCtrl(); //plistctrl2->draw(); //这里先不绘制了 //接着“借助普通的列表控件”,可以通水平滚动条装饰器绘制出一个“带水平滚动条的列表控件” DuDecoratorPattern::DuDecorator* plistctrl2_h = new DuDecoratorPattern::HorScrollBarDec(plistctrl2); //注意形参,是普通列表控件 plistctrl2_h->draw(); //这里完成最终绘制 //(3)释放资源 delete plistctrl_b_v; delete plistctrl_b; delete plistctrl; delete plistctrl2_h; delete plistctrl2; } }
调用:
// ConsoleDuDecoratorPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //装饰者模式、装饰器模式、Wrapper、Decorator Pattern // 2023年5月18日 涂聚文 Geovin Du Visual Studio 2022 edit. 文章来源《C++新经典设计模式》 王健伟编著 清华大学出版社 #define _UNICODE #include <iostream> #include <list> #include <map> #include "GeovinDu.h" #ifdef _DEBUG //只在Debug(调试)模式下 #ifndef DEBUG_NEW #define DEBUG_NEW new(_NORMAL_BLOCK,__FILE__,__LINE__) //重新定义new运算符 #define new DEBUG_NEW #endif #endif //#include <boost/type_index.hpp> using namespace std; //#pragma warning(disable : 4996) using namespace DuDecoratorPattern; int main() { std::cout << "Hello World!Programa Olá Mundo!涂聚文 Geovin Du\\n"; GeovinDu geovin; geovin.displayDecoratorSimple(); system("pause"); return 0; } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 #define UNICODE
输出:
Hello World!Programa Olá Mundo!涂聚文 Geovin Du\n绘制普通的列表控件! 绘制边框! 绘制垂直滚动条! ------------------------------- 绘制普通的列表控件! 绘制水平滚动条! 请按任意键继续. . .
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)