[设计模式] 行为型 | 5.中介者模式
1.模式动机:
- 网状结构:多对多联系将导致系统非常复杂,几乎每个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个对象与另外一个对象的直接耦合,这将导致一个过度耦合的系统
![](https://i-blog.csdnimg.cn/blog_migrate/b7eccaafaf7c69a86aa810302b4b5aaa.jpeg)
- 星型结构:中介者模式将系统的网状结构变成以中介者为中心的星型结构,同事对象不再直接与另一个对象联系,它通过中介者对象与另一个对象发生相互作用。系统的结构不会因为新对象的引入带来大量的修改工作
![](https://i-blog.csdnimg.cn/blog_migrate/6bb44e3bdf4a984faf1075ccd175e467.jpeg)
2.模式定义:
- 中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
- 中介者模式又称为调停者模式,它是一种对象行为型模式
3.模式结构:
- 中介者模式包含如下角色:
Mediator: 抽象中介者
ConcreteMediator: 具体中介者
Colleague: 抽象同事类
ConcreteColleague: 具体同事类
![](https://i-blog.csdnimg.cn/blog_migrate/37e46d6f0d418e84ae1cece6fb6228a7.png)
4.模式分析:
- 在中介者模式中,通过引入中介者来简化对象之间的复杂交互
- 中介者模式是迪米特法则的一个典型应用
- 对象之间多对多的复杂关系转化为相对简单的一对多关系
![](https://i-blog.csdnimg.cn/blog_migrate/3e1c8d298496ee0c74736150620a1a86.jpeg)
中介者类的职责
- 中转作用(结构性):各个同事对象不再需要显式地引用其他同事,当需要和其他同事进行通信时,可通过中介者来实现间接调用
- 协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装
抽象中介者类示例代码
public abstract class Mediator {
protected ArrayList<Colleague> colleagues = new ArrayList<Colleague>(); //用于存储同事对象
//注册方法,用于增加同事对象
public void register(Colleague colleague) {
colleagues.add(colleague);
}
//声明抽象的业务方法
public abstract void operation();
}
具体中介者类示例代码
public class ConcreteMediator extends Mediator {
//实现业务方法,封装同事之间的调用
public void operation() {
......
((Colleague)(colleagues.get(0))).method1(); //通过中介者调用同事类的方法
......
}
}
抽象同事类示例代码
public abstract class Colleague {
protected Mediator mediator; //维持一个抽象中介者的引用
public Colleague(Mediator mediator) {
this.mediator=mediator;
}
public abstract void method1(); //声明自身方法,处理自己的行为
//定义依赖方法,与中介者进行通信
public void method2() {
mediator.operation();
}
}
具体同事类示例代码
public class ConcreteColleague extends Colleague {
public ConcreteColleague(Mediator mediator) {
super(mediator);
}
//实现自身方法
public void method1() {
......
}
}
5.模式实例
虚拟聊天室:实例说明
- 某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息。该聊天室可以对不雅字符进行过滤,如“日”等字符;还可以对发送的图片大小进行控制。用中介者模式设计该虚拟聊天室。
虚拟聊天室:参考类图
![](https://i-blog.csdnimg.cn/blog_migrate/f6b573d9ec1f3dbf733883163fcfd530.png)
6.模式优缺点:
优点:
- 简化了对象之间的交互,它用中介者和同事的一对多交互代替了原来同事之间的多对多交互,将原本难以理解的网状结构转换成相对简单的星型结构
- 可将各同事对象解耦7
- 可以减少子类生成,中介者模式将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须直接对同事类进行扩展
缺点:
- 在具体中介者类中包含了大量的同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护
7.使用场景:
- 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解
- 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象
- 想通过一个中间类来封装多个类中的行为,又不想生成太多的子类