中介者模式
中介者模式通过引入一个中介对象来封装同级组件之间的交互,从而减少对象之间的直接依赖关系,降低耦合度,提高系统的可维护性。
结构
中介者模式示意图
中介者模式中,中介者对象负责协调下级组件在同级间的交互。中介者对象通常会维护一个组件列表,用于存储所有需要协调的组件。
当组件需要与其他组件通信时,它会向中介者对象发送请求,中介者对象会根据请求的内容选择合适的组件进行响应。中介者对象可以根据需要将请求转发给其他组件,也可以将请求广播给所有组件。
消息的发送者不知道最终会由谁来处理自己的请求,接收者也不知道最初是谁发出了请求。
应用场景
- 希望消除同级对象间的直接引用,降低耦合度时
- 希望解耦业务逻辑,编写更易复用的组件代码时
优缺点
优点
- 单一职责原则:将多个组件间的交流抽取到同一位置,使其更易于理解和维护。
- 开闭原则:可以为组件更换中介者对象,而不需要修改组件代码。
缺点
- 中介者可能与过多组件通信,导致其内部负责过多功能,内聚性降低,成为“上帝对象”。
代码示例
下面以一个智能家居系统为例,展示了中介者模式的实现。
在这个系统中,Light
(灯)、Thermostat
(恒温器)和 CoffeeMachine
(咖啡机)是组件。它们之间不直接通信,而是通过一个中介者 SmartHomeMediator
来协调。
每个组件都持有一个对中介者的引用。当一个组件的状态发生变化时(例如,灯被打开),它会通过调用 notify
方法来通知中-介者。中介者接收到通知后,会根据预设的逻辑来协调其他组件(例如,当中介者收到 light_on
事件时,它会指示恒温器调节温度,并触发咖啡机开始煮咖啡)。
这种设计避免了组件之间复杂的网状依赖关系,使得添加新组件或修改组件间的交互逻辑变得更加容易,因为所有的协调逻辑都集中在中介者中。