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(涂聚文)