
设计模式-中介者模式
发布日期:2021-05-26 06:27:25
浏览次数:28
分类:精选文章
本文共 3704 字,大约阅读时间需要 12 分钟。
设计模式-中介者模式(Mediator Pattern)
问题引出
在智能家居系统中,各个设备(如闹钟、咖啡机、窗帘、电视等)通过通信协调彼此的工作状态。然而,直接的通信方式会导致设备间耦合度高,维护性差,且扩展性不足。这种复杂的耦合关系使得系统难以扩展和维护。我们需要找到一种更高效的方式来处理这些设备间的通信。
传统解决方法
在传统的智能家居系统中,各个设备通过直接调用彼此的方法来实现状态变化。这意味着:
- 每个设备都需要明确知道其他设备的接口
- 状态传递可能变得混乱
- 增加新设备或改变流程会导致大量的重写工作
然而,这样的设计存在以下问题:
- 当各设备状态多变时,相互调用会过于复杂
- 设备间高度耦合,难以松解耦合
- 消息传递容易混乱
- 增加新设备或改变流程会降低系统的可维护性和扩展性
中介者模式
中介者模式通过引入一个中间对象来封装各个对象之间的交互。这样,各对象无需直接引用对方,减少耦合程度,提高系统的维护性和扩展性。
中介者模式的原理
中介者模式是一个行为模式,其核心思想是将对象间的交互封装在一个中介者对象中。具体表现为:
- 各对象通过中介者对象进行通信
- 中介者对象管理各对象之间的关系
- 中介者模式降低了对象间的耦合度,提高了系统的可维护性和扩展性
中介者模式的实现示例
考虑智能家居系统的设备间通信,使用中介者模式可以通过以下方式实现:
同事接口
package com.atguigu.mediator.smarthouse;public abstract class Colleague { private Mediator mediator; public String name; public Colleague(Mediator mediator, String name) { this.mediator = mediator; this.name = name; } public Mediator GetMediator() { return this.mediator; } public abstract void SendMessage(int stateChange);}
具体设备实现
各设备实现Colleague
接口,通过中介者对象进行通信:
public class Alarm extends Colleague { public Alarm(Mediator mediator, String name) { super(mediator, name); mediator.Register(name, this); } public void SendAlarm(int stateChange) { SendMessage(stateChange); } public void SendMessage(int stateChange) { this.GetMediator().GetMessage(stateChange, this.name); }}
中介者实现
中介者类定义了设备间的关系,并协调消息传递:
public class ConcreteMediator extends Mediator { private HashMapcolleagueMap; private HashMap interMap; public ConcreteMediator() { colleagueMap = new HashMap<>(); interMap = new HashMap<>(); } public void Register(String colleagueName, Colleague colleague) { colleagueMap.put(colleagueName, colleague); if (colleague instanceof Alarm) { interMap.put("Alarm", colleagueName); } else if (colleague instanceof CoffeeMachine) { interMap.put("CoffeeMachine", colleagueName); } else if (colleague instanceof TV) { interMap.put("TV", colleagueName); } else if (colleague instanceof Curtains) { interMap.put("Curtains", colleagueName); } } public void GetMessage(int stateChange, String colleagueName) { if (colleagueMap.get(colleagueName) instanceof Alarm) { if (stateChange == 0) { String coffeeMachineName = interMap.get("CoffeeMachine"); String tvName = interMap.get("TV"); ((CoffeeMachine) colleagueMap.get(coffeeMachineName)).StartCoffee(); ((TV) colleagueMap.get(tvName)).StartTv(); } else if (stateChange == 1) { String tvName = interMap.get("TV"); ((TV) colleagueMap.get(tvName)).StopTv(); } } else if (colleagueMap.get(colleagueName) instanceof CoffeeMachine) { String curtainsName = interMap.get("Curtains"); ((Curtains) colleagueMap.get(curtainsName)).UpCurtains(); } }}
测试用例
客户端测试中介者模式的实现:
public class ClientTest { public static void main(String[] args) { Mediator mediator = new ConcreteMediator(); Alarm alarm = new Alarm(mediator, "alarm"); CoffeeMachine coffeeMachine = new CoffeeMachine(mediator, "coffeeMachine"); Curtains curtains = new Curtains(mediator, "curtains"); TV tv = new TV(mediator, "TV"); alarm.SendAlarm(0); coffeeMachine.FinishCoffee(); alarm.SendAlarm(1); }}
中介者模式的注意事项和细节
- 多个类相互耦合:使用中介者模式可以将网状耦合结构转化为星型结构,减少耦合度。
- 减少依赖性:符合迪米特原则,减少类间依赖。
- 责任集中:中介者承担了多个对象之间的通信责任,一旦中介者出现问题,整个系统会受到影响。
- 设计复杂性:中介者对象的设计需要特别注意,避免自身复杂化。
总结
中介者模式通过引入中介者对象将设备间的耦合度降低,提高了系统的可维护性和扩展性。在智能家居系统中,中介者模式非常适合处理多个设备间的状态协调问题。通过正确设计中介者类和相互关系,可以实现松耦合的高效通信,提升系统整体性能和用户体验。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月15日 22时38分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
配置文件中有“路径信息”时,需呀注意的问题(路径中的\是转义字符)~
2019-03-23
桜の木になろう
2019-03-23
Python 读取16进制byte数据
2019-03-23
Python 存储和读取ASCII码形式的byte数据
2019-03-23
Ajax学习笔记-错误的处理-7
2019-03-23
微信小程序跳转微信小程序的实现
2019-03-23
SparkStreaming利用队列生成测试数据源
2019-03-23
简单三步VisualVm远程监控Java进程
2019-03-23
js——BOM操作知多少?
2019-03-23
划分子网与NAT的区别。。。
2019-03-23
信号量机制
2019-03-23
接口的私有方法
2019-03-23
钻石操作符使用升级
2019-03-23
设置方法区大小与OOM
2019-03-23
对象的实例化内存布局与访问定位内容
2019-03-23
计算机专业导论——语言与算法 (思维导图)
2019-03-23
检测到#include错误,请更新 includePath
2019-03-24
React + 导入模块的一个错误
2019-03-24
液体加载动画
2019-03-24
Laravel 直接返回404页面
2019-03-24