当前位置: 首页 > news >正文

设计模式:中介者模式 Mediator

目录

  • 前言
  • 问题
  • 解决方案
  • 结构
  • 代码


前言

中介者是一种行为设计模式,能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。


问题

假如你有一个创建和修改客户资料的对话框, 它由各种控件组成, 例如 文本框(TextField)、复选框(Checkbox) 和 按钮(Button)等。
在这里插入图片描述
某些表单元素可能会直接进行互动。 例如, 选中“我有一只狗”复选框后可能会显示一个隐藏文本框用于输入狗狗的名字。 另一个例子是提交按钮必须在保存数据前校验所有输入内容。
在这里插入图片描述
如果直接在表单元素代码中实现业务逻辑, 你将很难在程序其他表单中复用这些元素类。 例如, 由于复选框类与狗狗的文本框相耦合, 所以将无法在其他表单中使用它。 你要么使用渲染资料表单时用到的所有类,要么一个都不用。

解决方案

中介者模式建议你停止组件之间的直接交流并使其相互独立。这些组件必须调用特殊的中介者对象, 通过中介者对象重定向调用行为,以间接的方式进行合作。最终,组件仅依赖于一个中介者类,无需与多个其他组件相耦合。

在资料编辑表单的例子中, 对话框(Dialog) 类本身将作为中介者, 其很可能已知自己所有的子元素, 因此你甚至无需在该类中引入新的依赖关系。
在这里插入图片描述
绝大部分重要的修改都在实际表单元素中进行。 让我们想想提交按钮。之前,当用户点击按钮后,它必须对所有表单元素数值进行校验。 而现在它的唯一工作是将点击事件通知给对话框。 收到通知后, 对话框可以自行校验数值或将任务委派给各元素。 这样一来, 按钮不再与多个表单元素相关联,而仅依赖于对话框类。

你还可以为所有类型的对话框抽取通用接口, 进一步削弱其依赖性。 接口中将声明一个所有表单元素都能使用的通知方法, 可用于将元素中发生的事件通知给对话框。 这样一来,所有实现了该接口的对话框都能使用这个提交按钮了。

采用这种方式, 中介者模式让你能在单个中介者对象中封装多个对象间的复杂关系网。 类所拥有的依赖关系越少, 就越易于修改、扩展或复用。

结构

在这里插入图片描述

代码

#include <iostream>
#include <string>
#include <memory>
#include <map>
using namespace std;class AbstractComponent{
public:virtual void operation()=0;virtual ~AbstractComponent(){}
};class AbstractMediator{
public:virtual void notify(const string& sender)=0;virtual void addComponent(const string& name,shared_ptr<AbstractComponent> component)=0;virtual ~AbstractMediator(){}
};
class Dialog:public AbstractMediator{
public:void notify(const string& sender) override {if (sender == "button") {// 当按钮被触发时,协调复选框也执行操作cout << "中介者:按钮被按下,触发复选框操作" << endl;if (m_component.find("checkbox") != m_component.end()) {m_component["checkbox"]->operation();}} else if (sender == "checkbox") {cout<<"end"<<endl;}}void addComponent(const string& name,shared_ptr<AbstractComponent> component){m_component.insert(make_pair(name,component));}
private:map<string,shared_ptr<AbstractComponent>> m_component;
};class Button:public AbstractComponent{
public:Button(shared_ptr<AbstractMediator> mediator){m=mediator;}void operation() override {cout << "按钮被按下" << endl;// 自身状态变化后,通过中介者通知其他组件m->notify("button"); }
private:shared_ptr<AbstractMediator> m;
};
class Checkbox:public AbstractComponent{
public:Checkbox(shared_ptr<AbstractMediator> mediator){m=mediator;}void operation() override{cout << "调用复选框" << endl;// 自身状态变化后,通过中介者通知其他组件m->notify("checkbox"); }
private:shared_ptr<AbstractMediator> m;
};int main(){auto dialog=make_shared<Dialog>();auto button=make_shared<Button>(dialog);auto checkbox=make_shared<Checkbox>(dialog);dialog->addComponent("button",button);dialog->addComponent("checkbox",checkbox);button->operation();cout<<"----------------"<<endl;checkbox->operation();return 0;
}
http://www.dtcms.com/a/303993.html

相关文章:

  • Oracle发布MCP Server,自然语言交互说“人话”
  • Kubernetes高级调度01
  • 设计模式十三:代理模式(Proxy Pattern)
  • pygame 模拟放飞气球
  • hive专题面试总结
  • Python 日期时间格式化与解析的瑞士军刀:`strftime()` 与 `strptime()`
  • 三、Linux用户与权限管理详解
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现各种食物的类型检测识别(C#代码UI界面版)
  • 学习嵌入式的第三十四天-数据结构-(2025.7.29)数据库
  • 小杰数据结构(one day)——心若安,便是晴天;心若乱,便是阴天。
  • 【数据可视化-75】北京密云区2025年7月暴雨深度分析:Python + Pyecharts 炫酷大屏可视化(含完整数据、代码)
  • Prometheus + Grafana + Micrometer 监控方案详解
  • Java:为什么需要通配符捕获(wildcard capture)
  • HbuilderX开发小程序
  • 定制开发开源AI智能名片S2B2C商城小程序对流量重构与价值提升的作用研究
  • 使用git托管keil工程
  • React函数组件的“生活管家“——useEffect Hook详解
  • C++:stack与queue的使用
  • 40+个常用的Linux指令——下
  • 基于变频与移相混合控制(PFM+PSM)的全桥LLC谐振变换器仿真模型
  • 机械臂抓取的无模型碰撞检测代码
  • 仿函数+优先级队列priority_queue的模拟实现
  • P2910 [USACO08OPEN] Clear And Present Danger S
  • AutoGen Agent 使用指南
  • 华为HCIA-Cloud Service 从知识到实践的学习指南
  • SQL排查、分析海量数据以及锁机制
  • WebRTC(十四):WebRTC源码编译与管理
  • Webpack 优化策略
  • 如何用即构ZEGO SDK和uni-app开发一款直播带货应用?
  • uniapp 如果进入页面输入框自动聚焦,此时快速返回页面或者跳转到下一个页面,输入法顶上来的页面出现半屏的黑屏问题。