中介者模式
设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)
中介者模式其实也就是字面意思,跟你买房的时候往往需要找个中介一样。中介会帮你处理所有事情,你只需要与中介一个人建立联系就可以。那么跟之前学习的代理模式有什么不同之处,代理是完成类和增强类的功能,中介主要是为了解耦
没有中介之前的模式类似于网状结构,不仅你需要跟每个人联系,而且需要他们互相之前也去建立联系,令人头疼的是这种结构往往牵一发而动全身
网状结构
有中介之后类似于星状结构,所有人都找中介,大大降低了耦合性
星状结构
- 定义
- 优点
- 缺点
- 角色
- 场景模拟
- 总结
定义
中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。是迪米特法则的典型应用。
优点
降低各个对象的耦合性,使系统易于维护与扩展
缺点
每添加对象,就需要在中介处更新,如果对象过多,中介类就会变的臃肿,复杂难以维护
中介出问题,整个程序玩完,道理和卖房中介卷钱跑路一样
角色
抽象中介者(Mediator):中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
具体中介者(ConcreteMediator):实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系。
抽象同事类(Colleague):同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
具体同事类(Concrete Colleague):是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
场景模拟
模拟一个发送消息的场景,有三个同事需要互相发消息,这样他们就需要每个人都需要建立关系,现在引入一个中介,发出的消息都由中介去代替他们发送
代码实现
调用端
1 | //创建中介 |
结果输出
1 | 第一个同事发送消息 |
抽象中介,提供注册和转发方法
1 | public interface Mediator { |
抽象同事,保存中介对象,提供交互方法
1 | public abstract class Colleague { |
具体中介
1 | public class ConcreteMediator implements Mediator{ |
具体同事(每个都是一样的,输出略有变化,所有源码请查看git)
1 | public class ConcreteColleague1 extends Colleague{ |
总结
开发中并不常用,生活中常见,实际开发中可应用于对象间存在复杂网状关系时,可以引入中介者来使系统耦合性降低,更易扩展维护