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绘制普通的列表控件!
绘制边框!
绘制垂直滚动条!
-------------------------------
绘制普通的列表控件!
绘制水平滚动条!
请按任意键继续. . .

  

 

posted @ 2023-05-18 21:40  ®Geovin Du Dream Park™  阅读(12)  评论(0编辑  收藏  举报