/*****************************************************************//** * \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 單選按鈕“遊客登錄”被選中 單選按鈕“賬號登錄”被取消選中 編輯框“賬號”被設置爲了"禁用"狀態 編輯框“密碼”被設置爲了"禁用"狀態 按鈕“登錄”被設置爲了"啓用"狀態 按鈕“退出”被設置爲了"啓用"狀態 -------------------------- 單選按鈕“遊客登錄”被取消選中 單選按鈕“賬號登錄”被選中 編輯框“賬號”被設置爲了"啓用"狀態 編輯框“密碼”被設置爲了"啓用"狀態 按鈕“登錄”被設置爲了"禁用"狀態 請按任意鍵繼續. . .