总览模式核心意图典型场景中介者协调多个对象间的复杂交互智能家居中控、聊天室、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); } }