介绍
当多个对象之间存在通信关系的情况下,对象之间存在很强的关联性,会导致系统出现一些问题:
- 系统结构复杂,因为大量对象彼此关联,一个对象改变会导致其他对象发生变化,牵一发动全身
- 对象可重用性差:由于存在大量关联关系,就很难对对象进行重用
- 系统扩展性差:当系统内部关系负责,就很难对系统再进行功能的添加或修改
因此,对于系统内存在多个对象进行相互引用的情况下,为了降低引用关系复杂度,降低耦合程度,就可以使用中介者模式了,这就是中介者模式诞生的原因
定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
何时使用:多个类相互耦合,形成了网状结构。
如何解决:将上述网状结构分离为星型结构
关键代码:对象之间的通信封装到一个类中单独处理。
应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
优点:1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
缺点:中介者十分关键,出现问题会波及整个系统
示例
通过聊天室实例来演示中介者模式,实例中,多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息。
原本各个用户要想找其他人发送消息需要单独打开窗口,在n个用户下,最多出现 n(n-1)/2个窗口,而在聊天室模式中,N个用户只需要N个窗口即可,大大的缩减了系统复杂度
用户类
1 | public class User { |
聊天室类
1 | public class ChatRoom { |
通信测试
1 | public class Test { |
可以看到,在此示例中,各个用户需要给其他用户发送的消息,都统一发送给中介类聊天室管理,而聊天室这里显示的直接将信息打印。
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/28/designPattern/2020-03-28-mediatorPattern/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!