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

  

 

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