设计模式之中介者模式
1.1 中介者模式介绍提到中介模式有一个比较经典的例子就是航空管制。 为了让飞机在飞行的时候互不干扰每架飞机都需要知道其他飞机每时每刻的位置这就需要时刻跟其他飞机通信。飞机通信形成的通信网络就会无比复杂。这个时候我们通过引 入“塔台”这样一个中介让每架飞机只跟塔台来通信发送自己的位置给塔台由塔台来 负责每架飞机的航线调度。这样就大大简化了通信网络。中介模式(mediator pattern)的定义: 定义一个单独的(中介)对象,来封装一组对象之间的交互,将这组对象之间的交互委派给予中介对象交互,来避免对象之间的交互.中介者对象就是用于处理对象与对象之间的直接交互封装了多个对象之间的交互细节。中介模式的设计跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系从多对多的网状关系转换为一对多的星状关系.原来一个对象要跟N个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低代码的复杂度,提高代码的可读性和可维护性.1.2 中介者模式原理中介者模式包含以下主要角色抽象中介者Mediator角色它是中介者的接口提供了同事对象注册与转发同事对象信息的抽象方法。具体中介者ConcreteMediator角色实现中介者接口定义一个 List 来管理同事对象协调各个同事角色之间的交互关系因此它依赖于同事角色。抽象同事类Colleague角色定义同事类的接口保存中介者对象提供同事对象交互的抽象方法实现所有相互影响的同事类的公共功能。具体同事类Concrete Colleague角色是抽象同事类的实现者当需要与其他同事对象交互时由中介者对象负责后续的交互。1.3 中介者模式实现代码示例/* * 抽象中介者 * */ public interface Mediator { void apply(String key); } /* * 具体中介者 * */ public class ConcreteMediator implements Mediator{ Override public void apply(String key) { System.out.println(最终中介者执行操作key为: key ); } } /* * 抽象同事类 * */ public abstract class Colleague { private Mediator mediator; public Colleague(Mediator mediator) { this.mediator mediator; } public Mediator getMediator() { return mediator; } public abstract void exec(String key); } /* * 具体同事类A * */ public class ConcreteColleagueA extends Colleague{ public ConcreteColleagueA(Mediator mediator) { super(mediator); } Override public void exec(String key) { System.out.println(在组件A中通过中介者者执行); getMediator().apply(key); } } /* * 具体同事类B * */ public class ConcreteColleagueB extends Colleague{ public ConcreteColleagueB(Mediator mediator) { super(mediator); } Override public void exec(String key) { System.out.println(在组件B中通过中介者者执行); getMediator().apply(key); } } /* * 测试类 * */ public class TestMediator { Test public void Client(){ //创建中介者 Mediator mediator new ConcreteMediator(); //创建同事对象 Colleague c1 new ConcreteColleagueA(mediator); c1.exec(key-A); System.out.println(); Colleague c2 new ConcreteColleagueB(mediator); c2.exec(key-B); } }1.4 中介者模式应用实例【例】租房现在租房基本都是通过房屋中介房主将房屋托管给房屋中介而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。/* * 抽象中介者 * */ public abstract class Mediator { //创建联络方法 public abstract void contact(String message,Person person); } /* * 抽象同事者类 * */ public abstract class Person { protected String name; //持有中介者的引用 protected Mediator mediator; public Person(String name, Mediator mediator) { this.name name; this.mediator mediator; } } /* * 具体同事者类--房主 * */ public class HouseOwner extends Person { public HouseOwner(String name, Mediator mediator) { super(name, mediator); } //联系中介 public void contact(String message){ mediator.contact(message,this); } //获取租房者信息 public void getMessage(String message){ System.out.println(房主 name : 获得的租客需求为 message);; } } /* * 具体同事者类--租客 * */ public class Tenant extends Person{ public Tenant(String name, Mediator mediator) { super(name, mediator); } //联系中介 public void contact(String message){ mediator.contact(message,this); } //获得租房消息 public void getMessage(String message){ System.out.println(租客 name : 获取的房屋出租信息为message); } } /* * 具体中介者--中介机构 * */ public class MediatorStructure extends Mediator{ //中介机构知晓房主和租客的信息 private HouseOwner houseOwner; //房主 private Tenant tenant; //租客 public HouseOwner getHouseOwner() { return houseOwner; } public void setHouseOwner(HouseOwner houseOwner) { this.houseOwner houseOwner; } public Tenant getTenant() { return tenant; } public void setTenant(Tenant tenant) { this.tenant tenant; } Override public void contact(String message, Person person) { if(person houseOwner){ //如果是房东租客获得租房信息 tenant.getMessage(message); }else {//如果是租客房东获得租客租房需求信息 houseOwner.getMessage(message); } } } /* * 测试类 * */ public class TestMediator { Test public void TestClient(){ //中介 MediatorStructure mediator new MediatorStructure(); //房东 HouseOwner houseOwner new HouseOwner(张三,mediator); //租客 Tenant tenant new Tenant(李四,mediator); //中介收集房东和租客信息 mediator.setHouseOwner(houseOwner); mediator.setTenant(tenant); //出租信息 houseOwner.contact(出租南山一房4000一月押一付三价格可谈); //租房需求 tenant.contact(南山想要租一居室,预算价格3500-4000); } }1.5 中介者模式总结1) 中介者模式的优点中介者模式简化了对象之间的交互,他用中介者和同事的一对多代替了原来的同事之间的多对多的交互,一对多关系更好理解 易于维护和扩展,将原本难以理解的网状结构转换成习相对简单的星型结构.可以将各个同事就对象进行解耦.中介者有利于各个同事之间的松耦合,可以独立的改变或者复用每一个同事或者中介者,增加新的中介者类和新的同事类都比较方便,更符合开闭原则可以减少子类生成,中介者将原本分布与多个对象的行为集中在了一起,改变这些行为只需要生成新的中介者的子类即可,使得同事类可以被重用,无需直接对同事类进行扩展.2) 中介者模式的缺点在具体中介者类中包含了大量同事之间的交互细节,可能会导致中介者类变得非常的复杂,使得系统不好维护.3) 中介者模式使用场景系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解.一个对象由于引用了其他的很多对象并且直接和这些对象进行通信,导致难以复用该对象.想要通过一个中间类来封装多个类中的行为,而又不想生成太多的子类,此时可以通过引用中介者类来实现,在中介者类中定义对象的交互的公共行为,如果需要改变行为则可以在增加新的中介类.

相关新闻

移动端AI Agent工程实践:从OpenClaw到Android的Harness Engineering

移动端AI Agent工程实践:从OpenClaw到Android的Harness Engineering

1. 项目概述:从实验室原型到移动端可用的跨越最近在AI工程化领域,一个话题讨论得挺热:如何把一个听起来很酷的实验室Agent框架,真正变成一个能在用户手机上稳定运行、解决实际问题的应用。标题里的“从OpenClaw到Android”&#x…

2026/8/24 3:36:12 阅读更多 →
公认难考但含金量高的8本金融行业证书,职场进阶该怎么选

公认难考但含金量高的8本金融行业证书,职场进阶该怎么选

打开招聘软件,金融类岗位的任职要求里,证书那一栏总是绕不开的话题。很多同学会问:到底哪些证书真正值得花时间考?难考的和好用的是一回事吗?这篇文章从国内就业实用性出发,把金融圈常见证书梳理成四个梯队…

2026/8/24 3:36:12 阅读更多 →
ThinkPad X230 黑苹果安装指南:从 BIOS 到 EFI 迁移,让这台商务本跑起 macOS

ThinkPad X230 黑苹果安装指南:从 BIOS 到 EFI 迁移,让这台商务本跑起 macOS

ThinkPad X230 黑苹果安装指南:从 BIOS 到 EFI 迁移,让这台商务本跑起 macOS 【免费下载链接】X230-Hackintosh READMEs, OpenCore configurations, patches, and notes for the Thinkpad X230 Hackintosh 项目地址: https://gitcode.com/gh_mirrors/x…

2026/8/24 3:36:12 阅读更多 →

最新新闻

GBC:基于梯度的连接优化,让多智能体系统学会自主协作

GBC:基于梯度的连接优化,让多智能体系统学会自主协作

1. 项目概述:从“各自为战”到“协同进化”的智能体优化在构建复杂的多智能体系统时,我们常常会遇到一个核心瓶颈:智能体之间如何高效协作?传统的多智能体系统设计,无论是基于规则、强化学习还是其他启发式方法&#x…

2026/8/24 9:41:04 阅读更多 →
自进化智能体SEA-TS:自动化时间序列预测的架构与实战

自进化智能体SEA-TS:自动化时间序列预测的架构与实战

1. 项目概述:当时间序列预测遇上自进化智能体最近在算法工程和自动化机器学习领域,一个名为“SEA-TS”的项目引起了我的注意。它的全称是“Self-Evolving Agent for Autonomous Code Generation of Time Series Forecasting Algorithms”,直译…

2026/8/24 9:41:04 阅读更多 →
类别特征处理实战:从One-Hot到Embedding的权衡与架构整合

类别特征处理实战:从One-Hot到Embedding的权衡与架构整合

1. 面试中的“送分题”与“送命题”又到了招聘季,作为面试官或者候选人,我们总会遇到一些看似基础,实则暗藏玄机的问题。“类别数据处理”就是其中之一。当面试官问起“如何处理类别特征”时,一个标准的回答往往是:“对…

2026/8/24 9:41:04 阅读更多 →
30 行 C 代码跑通 raylib 即时模式 GUI:raygui 游戏参数面板实战

30 行 C 代码跑通 raylib 即时模式 GUI:raygui 游戏参数面板实战

30 行 C 代码跑通 raylib 即时模式 GUI:raygui 游戏参数面板实战 【免费下载链接】raylib A simple and easy-to-use library to enjoy videogames programming 项目地址: https://gitcode.com/GitHub_Trending/ra/raylib 下面用 raylib 的 raygui 模块做出一…

2026/8/24 9:41:04 阅读更多 →
AI智能体推荐系统:如何为复杂叙事查询匹配最佳AI助手

AI智能体推荐系统:如何为复杂叙事查询匹配最佳AI助手

1. 项目概述:当“讲故事”的查询遇上AI智能体推荐最近在AI应用落地的圈子里,一个词被反复提及:AgentSelect。乍一看,它像是一个工具或平台的名字,但结合其全称“Benchmark for Narrative Query-to-Agent Recommendatio…

2026/8/24 9:41:04 阅读更多 →
用100万域名压测BBRF:高吞吐子域名入库管道是怎么实现的(含测试数据与源码)

用100万域名压测BBRF:高吞吐子域名入库管道是怎么实现的(含测试数据与源码)

用100万域名压测BBRF:高吞吐子域名入库管道是怎么实现的(含测试数据与源码) 【免费下载链接】bbrf-client The Bug Bounty Reconnaissance Framework (BBRF) can help you coordinate your reconnaissance workflows across multiple devices…

2026/8/24 9:40:03 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →