首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >cpp: Mediator Pattern

cpp: Mediator Pattern

作者头像
geovindu
发布2026-06-19 09:51:24
发布2026-06-19 09:51:24
00
举报
代码语言:javascript
复制
/*****************************************************************//**
 * \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;
        }
 
    }
 
}

调用:

代码语言:javascript
复制
/*****************************************************************//**
 * \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

输出:

代码语言:javascript
复制
Hello World!涂聚文 Geovin Du
单选按钮“游客登录”被选中
单选按钮“账号登录”被取消选中
编辑框“账号”被设置为了"禁用"状态
编辑框“密码”被设置为了"禁用"状态
按钮“登录”被设置为了"启用"状态
按钮“退出”被设置为了"启用"状态
--------------------------
单选按钮“游客登录”被取消选中
单选按钮“账号登录”被选中
编辑框“账号”被设置为了"启用"状态
编辑框“密码”被设置为了"启用"状态
按钮“登录”被设置为了"禁用"状态
请按任意键继续. . .
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档