/*****************************************************************//** * \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 单选按钮“游客登录”被选中 单选按钮“账号登录”被取消选中 编辑框“账号”被设置为了"禁用"状态 编辑框“密码”被设置为了"禁用"状态 按钮“登录”被设置为了"启用"状态 按钮“退出”被设置为了"启用"状态 -------------------------- 单选按钮“游客登录”被取消选中 单选按钮“账号登录”被选中 编辑框“账号”被设置为了"启用"状态 编辑框“密码”被设置为了"启用"状态 按钮“登录”被设置为了"禁用"状态 请按任意键继续. . .