尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
相似模式区分
总览模式核心意图典型场景中介者协调多个对象间的复杂交互智能家居中控、聊天室、GUI组件联动观察者一对多的通知机制事件监听、消息订阅、数据绑定门面为子系统提供统一入口API封装、SDK入口、简化调用中介者 vs 观察者维度中介者模式观察者模式核心意图集中协调多对象间的双向交互一对多的单向通知结构差异中介者知道所有同事同事只知道中介者主题知道所有观察者观察者只知道主题关注点对象间的交互规则和联动逻辑状态变化的通知分发典型场景智能家居中控、聊天室、工作流引擎事件监听、消息订阅、数据绑定逐步区分法如果对象间需要双向交互A变化影响BB变化可能再影响A→ 选中介者如果只是单向通知主题变化通知观察者观察者不反向影响主题→ 选观察者如果联动规则复杂需要集中管理 → 选中介者简单记忆口诀中介者管双向协调观察者管单向通知。推荐大多数场景下复杂联动用中介者简单通知用观察者。Spring事件机制是观察者的变体但可以用于简单联动场景。中介者 vs 门面维度中介者模式门面模式核心意图协调多对象间的交互降低耦合为复杂子系统提供统一入口简化调用结构差异中介者参与业务逻辑协调对象间的交互门面只是封装调用入口不参与子系统内部逻辑关注点对象间的交互规则子系统的使用接口典型场景聊天室、GUI组件联动、工作流引擎API封装、SDK入口、简化配置逐步区分法如果需要协调多个对象间的交互对象间有联动→ 选中介者如果只是简化调用入口提供一个统一接口调用多个子系统→ 选门面如果对象需要反向通知中介者 → 选中介者门面是单向的简单记忆口诀中介者管交互门面管入口。推荐门面用于简化外部调用中介者用于协调内部交互。两者可以组合使用门面作为外部入口中介者协调内部逻辑。练习题目智能家居中控系统题目描述小明正在设计一个智能家居系统系统中有灯Light、窗帘Curtain、空调AC三种设备它们通过智能家居中控中介者来协调联动。设备之间不直接通信所有联动逻辑由中控负责。中控的联动规则空调开启 → 自动关闭窗帘避免冷气流失空调关闭 → 自动打开窗帘窗帘关闭 → 自动开灯补充采光窗帘打开 → 自动关灯自然光足够注意联动可能产生连锁反应。例如开启空调 → 关闭窗帘 → 开灯。同一设备在同一次连锁中状态只改变一次避免循环触发。输入描述第一行包含三个字符串分别是灯、窗帘、空调的名称用空格分隔。第二行包含三个字符串分别是灯、窗帘、空调的初始状态on 或 off用空格分隔。接下来每行包含一个操作格式为设备名 操作操作为 on 或 off直到输入结束。输出描述对于每个操作按联动触发顺序输出每个状态发生变化的设备格式为设备名 on 或设备名 off。若操作未导致状态变化设备已在目标状态则不输出。输入示例Light Curtain AC off on off AC on AC off Curtain off输出示例AC on Curtain off Light on AC off Curtain on Light off Curtain off Light on解题思路本题的核心是中介者模式的连锁反应机制。角色对应Mediator抽象中介者Mediator接口定义send方法ConcreteMediator具体中介者SmartHomeMediator实现联动规则空调→窗帘→灯Colleague抽象同事类Device抽象类持有中介者引用提供send和receive方法ConcreteColleague具体同事类Light、Curtain、AC具体设备实现连锁反应机制用户操作设备如开启空调→ 调用device.send(on)send方法更新状态并输出然后通知中介者mediator.send(on, this)中介者根据联动规则调用相关设备的receive方法如关闭窗帘receive方法更新状态并输出再次通知中介者形成递归连锁避免循环触发在send和receive中检查if (!status.equals(message))如果状态已经是目标状态则不处理import java.util.*; public class Main { public static void main(String[] args) { Scanner sc new Scanner(System.in); String line sc.nextLine(); String[] names line.split( ); line sc.nextLine(); String[] status line.split( ); Mediator mediator new SmartHomeMediator(); Light light new Light(mediator, names[0], status[0]); Curtain curtain new Curtain(mediator, names[1], status[1]); AC ac new AC(mediator, names[2], status[2]); mediator.setLight(light); mediator.setCurtain(curtain); mediator.setAc(ac); MapString, Device map new HashMap(); map.put(names[0], light); map.put(names[1], curtain); map.put(names[2], ac); while (sc.hasNext()) { String name sc.next(); String s sc.next(); Device d map.get(name); d.send(s); } } } // 抽象中介者 interface Mediator { public void send(String message, Device device); } // 具体中介者智能家居中控 class SmartHomeMediator implements Mediator { private Light light; private Curtain curtain; private AC ac; public void setLight(Light light) { this.light light; } public void setCurtain(Curtain curtain) { this.curtain curtain; } public void setAc(AC ac) { this.ac ac; } public void send(String message, Device device) { // 空调状态变化触发窗帘联动 if (device instanceof AC) { if (message.equals(on)) { curtain.receive(off); // 规则1空调开 → 关窗帘 } else { curtain.receive(on); // 规则2空调关 → 开窗帘 } } // 窗帘状态变化触发灯联动 else if (device instanceof Curtain) { if (message.equals(on)) { light.receive(off); // 规则4窗帘开 → 关灯 } else { light.receive(on); // 规则3窗帘关 → 开灯 } } // 灯状态变化不触发联动 } } // 抽象同事类设备基类 abstract class Device { protected Mediator mediator; protected String name; protected String status; public Device(Mediator mediator, String name, String status) { this.mediator mediator; this.name name; this.status status; } public String getName() { return name; } public String getStatus() { return status; } // 用户操作触发状态变化 public void send(String message) { if (!status.equals(message)) { System.out.println(name message); status message; mediator.send(message, this); // 通知中介者 } } // 中介者通知触发状态变化 public void receive(String message) { if (!status.equals(message)) { System.out.println(name message); status message; mediator.send(message, this); // 状态变化后通知中介者形成连锁 } } } // 具体同事类灯 class Light extends Device { public Light(Mediator mediator, String name, String status) { super(mediator, name, status); } } // 具体同事类窗帘 class Curtain extends Device { public Curtain(Mediator mediator, String name, String status) { super(mediator, name, status); } } // 具体同事类空调 class AC extends Device { public AC(Mediator mediator, String name, String status) { super(mediator, name, status); } }
RELATED

相关推荐

许可证高峰冲突怎么分析:管理者该先看项目节点重叠,还是先看批量作业集中时段

许可证高峰冲突怎么分析:管理者该先看项目节点重叠,还是先看批量作业集中时段

摘要如果企业在没有完成使用分析的前提下就直接增购,往往会出现预算增加但利用率依旧偏低的情况。本文从高峰并发、模块结构、低效占用和历史趋势四个维度,分析为什么多数企业更适合先优化,再判断是否需要增购。 很多企业第一次认真看许可证排…

📅 2026/11/1 16:16:07
BiSheng JDK 11性能测试报告:大数据场景下的实战表现

BiSheng JDK 11性能测试报告:大数据场景下的实战表现

BiSheng JDK 11性能测试报告:大数据场景下的实战表现 【免费下载链接】bishengjdk-11 BiSheng JDK 11 is a high-performance, production-ready distribution of OpenJDK 11. 项目地址: https://gitcode.com/openeuler/bishengjdk-11 前往项目官网免费下载&…

📅 2026/9/4 8:41:38
okbiye 搞定期刊发文全链路!三类期刊专属 AI 写作功能一站式适配投稿需求

okbiye 搞定期刊发文全链路!三类期刊专属 AI 写作功能一站式适配投稿需求

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/期刊论文期刊论文 - Okbiye智能写作https://www.okbiye.com/ai/qklw 对于本科生、硕博研究生、科研从业者而言,期刊投稿是学术成果落地的关键一步,但撰写期刊文稿的门槛常年让无数人望…

📅 2026/9/26 3:49:26
MORE NEWS

更多资讯

📰

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

📰

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

📰

先能用,再好用:从烂尾复盘到两周上线,全栈项目的‘原型—快速迭代‘方法论

先能用,再好用:从烂尾复盘到两周上线,全栈项目的“原型—快速迭代”方法论 全栈学习路径的文章已经很多了:怎么选技术栈、怎么搭环境、怎么记文档,几乎每个方向都有人写。但一个更扎心的问题很少有人正面讨论——为什…

📰

深度思考模式把 ARC-AGI-2 从 17.6% 拉到 45.1%:对照 Gemini 3 Pro 的三份能力评测,看‘会思考‘改写了哪些边界

深度思考模式把 ARC-AGI-2 从 17.6% 拉到 45.1%:对照 Gemini 3 Pro 的三份能力评测,看“会思考”改写了哪些边界 一、先说结论:变强的不是“知识”,而是“解法” 每次新模型发布,评测榜单都会涨几个点,大…

📰

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

📰

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬