cpp: Mediator Pattern

 

/*****************************************************************//**
 * \file   ControlParent.h
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef CONTROLPARENT_H 
#define CONTROLPARENT_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>


using namespace std;

/**
 * 1:纯金与赤金
2:足金与千足金
3:铂金
4、3D硬金
5、K金.
 */


namespace DuJewelryMediatorPattern
{

	/// <summary>
	/// UI控件类的父类
	/// </summary>
	class ControlParent
	{
	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="caption"></param>
		ControlParent(string caption) :mCaption(caption) {} 
		/// <summary>
		/// 做父类时析构函数应该为虚函数
		/// </summary>
		virtual ~ControlParent() {} 
	public:
		/// <summary>
		/// 当UI控件发生变化时该成员函数会被调用
		/// </summary>
		/// <param name="tmpuictllist"></param>
		virtual void Changed(map<string, ControlParent*>& tmpuictllist) = 0; //形参所代表的map容器中包含着所有对话框中涉及到的UI控件,注意文件头要#include <map>		
		/// <summary>
		/// 设置UI控件启用或禁用
		/// </summary>
		/// <param name="sign"></param>
		virtual void Enable(bool sign) = 0;
	protected:
		/// <summary>
		/// 控件上面显示的文字内容,本范例假设每个UI控件上的文字都不同
		/// </summary>
		string mCaption; 


	};

}

#endif

/*****************************************************************//**
 * \file   GoldButton.h
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef GOLDBUTTON_H 
#define GOLDBUTTON_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>

#include "ControlParent.h"


using namespace std;



namespace DuJewelryMediatorPattern
{

	/// <summary>
	/// 普通按钮相关类
	/// </summary>
	class GoldButton:public ControlParent
	{

	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="caption"></param>
		GoldButton(string caption) :ControlParent(caption) {} 	

	public:
		/// <summary>
		/// 设置按钮的启用或禁用
		/// </summary>
		/// <param name="sign"></param>
		virtual void Enable(bool sign)
		{
			if (sign == true)
			{
				cout << "按钮“" << mCaption << "”被设置为了\"启用\"状态" << endl;
			}
			else
			{
				cout << "按钮“" << mCaption << "”被设置为了\"禁用\"状态" << endl;
			}
			//具体实现按钮启用或者禁用的代码略......
		}
		/// <summary>
		/// 按钮被按下时该成员函数会被调用
		/// </summary>
		/// <param name="tmpuictllist"></param>
		virtual void Changed(map<string, ControlParent*>& tmpuictllist);

	};
}

#endif

/*****************************************************************//**
 * \file   GoldRadioButton.h
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef GOLDRADIOBUTTON_H 
#define GOLDRADIOBUTTON_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>

#include "ControlParent.h"
#include "GoldEditControl.h"


using namespace std;



namespace DuJewelryMediatorPattern
{

	/// <summary>
	/// 单选按钮相关类
	/// </summary>
	class GoldRadioButton:public ControlParent
	{

	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="caption"></param>
		GoldRadioButton(string caption) :ControlParent(caption) {} 

	public:
		/// <summary>
		/// 设置单选按钮的启用或禁用
		/// </summary>
		/// <param name="sign"></param>
		virtual void Enable(bool sign)
		{
			//本范例用不到该功能,实现代码略......
		}
		/// <summary>
		/// 设置单选按钮为被选中或者被取消选中,被选中的单选按钮中间有个黑色实心圆点
		/// </summary>
		/// <param name="sign"></param>
		void Selected(bool sign)
		{
			if (sign == true)
			{
				cout << "单选按钮“" << mCaption << "”被选中" << endl;
			}
			else
			{
				cout << "单选按钮“" << mCaption << "”被取消选中" << endl;
			}
			//具体实现单选按钮被选中或者被取消选中的代码略......
		}
		/// <summary>
		/// 单选按钮被单击时该成员函数会被调用
		/// </summary>
		/// <param name="tmpuictllist"></param>
		virtual void Changed(map<string, ControlParent*>& tmpuictllist);

	};

}
#endif

/*****************************************************************//**
 * \file   GoldEditControl.h
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef GOLDEDITCONTROL_H 
#define GOLDEDITCONTROL_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>

#include "ControlParent.h"


using namespace std;



namespace DuJewelryMediatorPattern
{

	/// <summary>
	/// 编辑框相关类
	/// </summary>
	class GoldEditControl:public ControlParent
	{
	public:
		/// <summary>
		/// 构造函数
		/// </summary>
		/// <param name="caption"></param>
		GoldEditControl(string caption) :ControlParent(caption) {} 


	public:
		/// <summary>
		/// 设置编辑框的启用或禁用
		/// </summary>
		/// <param name="sign"></param>
		void Enable(bool sign)
		{
			if (sign == true)
			{
				cout << "编辑框“" << mCaption << "”被设置为了\"启用\"状态" << endl;
			}
			else
			{
				cout << "编辑框“" << mCaption << "”被设置为了\"禁用\"状态" << endl;
			}
			//具体实现编辑框启用或者禁用的代码略......
		}
		/// <summary>
		/// 是否编辑框中的内容为空 
		/// </summary>
		/// <returns></returns>
		bool isContentEmpty()
		{
			return m_content.empty();
		}
		/// <summary>
		/// 编辑框内容发生变化时该成员函数会被调用
		/// </summary>
		/// <param name="tmpuictllist"></param>
		virtual void Changed(map<string, ControlParent*>& tmpuictllist);


	private:
		/// <summary>
		/// 编辑框中的内容
		/// </summary>
		string m_content = ""; 


	};

}

#endif


/*****************************************************************//**
 * \file   GoldButton.cpp
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#include "GoldButton.h"

using namespace std;



namespace DuJewelryMediatorPattern
{

	/// <summary>
	/// 按钮被按下时该成员函数会被调用
	/// </summary>
	/// <param name="tmpuictllist"></param>
	void GoldButton::Changed(map<string, ControlParent*>& tmpuictllist)
	{
		if (mCaption == "登录")
		{
			//按下的是登录按钮
			cout << "开始游戏登录验证,根据验证结果决定是进入游戏之中还是验证失败给出提示!" << endl;
		}
		else if (mCaption == "退出")
		{
			//按下的是退出按钮,则退出整个游戏
			cout << "游戏退出,再见!" << endl;
		}
	}
}

/*****************************************************************//**
 * \file   GoldEditControl.cpp
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#include "GoldEditControl.h"
using namespace std;



namespace DuJewelryMediatorPattern
{


	/// <summary>
	/// 编辑框内容发生变化时该成员函数会被调用
	/// </summary>
	/// <param name="tmpuictllist"></param>
	void GoldEditControl::Changed(map<string, ControlParent*>& tmpuictllist)
	{
		if ((static_cast<GoldEditControl*>(tmpuictllist["账号"]))->isContentEmpty() || (static_cast<GoldEditControl*>(tmpuictllist["密码"]))->isContentEmpty())
		{
			//如果“账号”编辑框或者“密码”编辑框有一个为空,则不允许登录
			tmpuictllist["登录"]->Enable(false); //“登录”按钮设置为禁用
		}
		else
		{
			tmpuictllist["登录"]->Enable(true); //“登录”按钮设置为启用
		}
	}


}

/*****************************************************************//**
 * \file   GoldRadioButton.cpp
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#include "GoldRadioButton.h"
using namespace std;



namespace DuJewelryMediatorPattern
{

	/// <summary>
	/// 单选按钮被单击时该成员函数会被调用
	/// </summary>
	/// <param name="tmpuictllist"></param>
	void GoldRadioButton::Changed(map<string, ControlParent*>& tmpuictllist)
	{
		if (mCaption == "游客登录")
		{
			(static_cast<GoldRadioButton*>(tmpuictllist["游客登录"]))->Selected(true); //“游客登录”单选按钮设置为选中
			(static_cast<GoldRadioButton*>(tmpuictllist["账号登录"]))->Selected(false); //“账号登录”单选按钮设置为取消选中

			tmpuictllist["账号"]->Enable(false); //“账号”编辑框设置为禁用
			tmpuictllist["密码"]->Enable(false); //“密码”编辑框设置为禁用

			tmpuictllist["登录"]->Enable(true); //“登录”按钮设置为启用
		}
		else if (mCaption == "账号登录")
		{
			(static_cast<GoldRadioButton*>(tmpuictllist["游客登录"]))->Selected(false); //“游客登录”单选按钮设置为取消选中
			(static_cast<GoldRadioButton*>(tmpuictllist["账号登录"]))->Selected(true); //“账号登录”单选按钮设置为选中

			tmpuictllist["账号"]->Enable(true); //“账号”编辑框设置为启用
			tmpuictllist["密码"]->Enable(true); //“密码”编辑框设置为启用

			if ((static_cast<GoldEditControl*>(tmpuictllist["账号"]))->isContentEmpty() || (static_cast<GoldEditControl*>(tmpuictllist["密码"]))->isContentEmpty())
			{
				//如果“账号”编辑框或者“密码”编辑框有一个为空,则不允许登录
				tmpuictllist["登录"]->Enable(false); //“登录”按钮设置为禁用
			}
			else
			{
				tmpuictllist["登录"]->Enable(true); //“登录”按钮设置为启用
			}
		}
	}


}

/*****************************************************************//**
 * \file   GeovinDu.h
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#pragma once
#ifndef GEOVINDU_H 
#define GEOVINDU_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <vector>
#include <map>

#include "ControlParent.h"
#include "GoldButton.h"
#include "GoldEditControl.h"
#include "GoldRadioButton.h"

using namespace std;



namespace DuJewelryMediatorPattern
{

	/// <summary>
	/// 
	/// </summary>
	class GeovinDu
	{

	private:

	public:

		/// <summary>
		/// 
		/// </summary>
		void displaySimple();



	};

}
#endif




/*****************************************************************//**
 * \file   GeovinDu.cpp
 * \brief  MediatorPattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
#include "GeovinDu.h"
using namespace std;



namespace DuJewelryMediatorPattern
{

	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displaySimple()
	{
		//创建各种UI控件	
		map<string, DuJewelryMediatorPattern::ControlParent*> uictllist;	//将所有创建的UI控件保存到map容器中,方便进行参数传递
		uictllist["登录"] = new DuJewelryMediatorPattern::GoldButton("登录");
		uictllist["退出"] = new DuJewelryMediatorPattern::GoldButton("退出");

		uictllist["游客登录"] = new DuJewelryMediatorPattern::GoldRadioButton("游客登录");
		uictllist["账号登录"] = new DuJewelryMediatorPattern::GoldRadioButton("账号登录");

		uictllist["账号"] = new DuJewelryMediatorPattern::GoldEditControl("账号");
		uictllist["密码"] = new DuJewelryMediatorPattern::GoldEditControl("密码");


		//设置一下缺省的UI控件状态	
		//因为只有子类型才有Selected成员函数,所以这里需要用到强制类型转换
		(static_cast<DuJewelryMediatorPattern::GoldRadioButton*>(uictllist["游客登录"]))->Selected(true); //“游客登录”单选按钮设置为选中
		(static_cast<DuJewelryMediatorPattern::GoldRadioButton*>(uictllist["账号登录"]))->Selected(false); //“账号登录”单选按钮设置为取消选中

		uictllist["账号"]->Enable(false); //“账号”编辑框设置为禁用
		uictllist["密码"]->Enable(false); //“密码”编辑框设置为禁用

		uictllist["登录"]->Enable(true); //“登录”按钮设置为启用
		uictllist["退出"]->Enable(true); //“退出”按钮设置为启用

		cout << "--------------------------" << endl;
		uictllist["账号登录"]->Changed(uictllist); //模拟“账号登录”单选按钮被单击选中

		//释放资源
		for (auto iter = uictllist.begin(); iter != uictllist.end(); iter++)
		{
			delete iter->second;
			iter->second = nullptr;
		}

	}

}

  

调用:

/*****************************************************************//**
 * \file   ConsoleDuMediatorPattern.cpp
 * \brief  Mediator Pattern 中介者模式 亦称: 调解人、控制器、Intermediary、Controller、Mediator C++ 14
 * 2023年6月4日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   June 2023
 *********************************************************************/
// ConsoleDuMediatorPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _UNICODE

#include <iostream>

#include "GeovinDu.h"

using namespace std;
using namespace DuJewelryMediatorPattern;



int main()
{
    std::cout << "Hello World!涂聚文 Geovin Du\n";
    GeovinDu geovin;
    geovin.displaySimple();

    system("pause");

    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
#define UNICODE

  

输出:

Hello World!涂聚文 Geovin Du
单选按钮“游客登录”被选中
单选按钮“账号登录”被取消选中
编辑框“账号”被设置为了"禁用"状态
编辑框“密码”被设置为了"禁用"状态
按钮“登录”被设置为了"启用"状态
按钮“退出”被设置为了"启用"状态
--------------------------
单选按钮“游客登录”被取消选中
单选按钮“账号登录”被选中
编辑框“账号”被设置为了"启用"状态
编辑框“密码”被设置为了"启用"状态
按钮“登录”被设置为了"禁用"状态
请按任意键继续. . .

  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章