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

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号