17.中介模式设计思想
目录介绍
- 01.中介者模式基础
- 1.1 中介者模式由来
- 1.2 中介者模式定义
- 1.3 中介者模式场景
- 1.4 中介者模式思考
- 1.5 中介者模式特点
- 1.6 主要解决问题
- 02.中介者模式原理
- 2.1 罗列一个场景
- 2.2 用例子理解中介者
- 2.3 需求普通实现
- 2.4 案例演变实现
- 2.5 中介者模式实现步骤
- 03.中介者模式结构
- 3.1 中介者标准案例
- 3.2 中介者模式结构
- 3.3 中介者模式时序图
- 04.中介者模式案例分析
- 4.1 角色分析
- 4.2 拓展一个场景
- 4.3 中介者模式实践
- 05.中介者者模式分析
- 5.1 中介者模式优点
- 5.2 中介者模式缺点
- 5.3 使用建议说明
- 5.4 使用环境
- 5.5 适用场景
- 5.6 思考题考察
- 06.观察者模式总结
- 6.1 总结一下学习
- 6.2 更多内容推荐
01.中介者模式基础
1.1 中介者模式由来
在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题:
- 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他所有对象,并进行适当处理。
- 对象可重用性差:由于一个对象和其他对象具有很强的关联,若没有其他对象的支持,一个对象很难被另一个系统或模块重用,这些对象表现出来更像一个不可分割的整体,职责较为混乱。
- 系统扩展性低:增加一个新的对象需要在原有相关对象上增加引用,增加新的引用关系也需要调整原有对象,系统耦合度很高,对象操作很不灵活,扩展性差。
在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。
对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。
1.2 中介者模式定义
中介模式的英文翻译是 Mediator Design Pattern。在 GoF 中的《设计模式》一书中,它是这样定义的:
Mediator pattern defines a separate (mediator) object that encapsulates the interaction between a set of objects and the objects delegate their interaction to a mediator object instead of interacting with each other directly.
翻译成中文就是:中介模式定义了一个单独的(中介)对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。
1.3 中介者模式场景
一些使用中介者的实际案例有:
- MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者
- 机场调度系统。
1.4 中介者模式思考
如何给代码解耦?其中一个方法就是引入中间层。
1.5 中介者模式特点
实际上,中介模式的设计思想跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系(或者说依赖关系)从多对多(网状关系)转换为一对多(星状关系)。
原来一个对象要跟 n 个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性和可维护性。
1.6 主要解决问题
对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
02.中介者模式原理
2.1 罗列一个场景
案例:多架飞机需要跑道降落,塔台指挥。
案例说明:每一架飞机都是一个组件,拥有一些相同的行为,塔台作为中介者指挥飞机降落。
2.2 用例子理解中介者
2.3 需求普通实现
2.4 案例演变实现
抽象中介者(Mediator)角色
/**
* 抽象中介者(Mediator)角色 : 塔台
*/
public interface TowerMediator {
/**
* 通知方法 : 通知飞机降落
* @param track
*/
public abstract void notify(String type,String track);
/**
* 在中介者中添加组件类
* @param colleague
*/
public abstract void register(AirplaneComponent colleague);
/**
* 在中介者中移除组件类
* @param colleague
*/
public abstract void remove(AirplaneComponent colleague);
}
具体中介者(Concrete Mediator)角色
2.5 中介者模式实现步骤
03.中介者模式结构
3.1 中介者标准案例
3.2 中介者模式结构
中介者模式包含如下角色:
- Mediator: 抽象中介者。定义统一的接口,用于各组件角色之间的通信,提供了组件对象注册与转发组件对象信息的抽象方法。
- ConcreteMediator: 具体中介者。实现中介者接口,协调各个组件角色之间的交互关系,有时会对组件角色生命周期进行管理。
- Colleague: 抽象同事类。定义组件类的接口,持有一个中介者对象的引用,提供组件对象交互的抽象方法,实现组件类的公共行为。
- ConcreteColleague: 具体同事类。继承抽象组件类,实现自己的业务,它并不知道其他组件类的具体行为,在需要时通过与中介者通信,中介者会负责与其它的组件交互。
3.3 中介者模式时序图
04.中介者模式案例分析
4.1 角色分析
4.2 拓展一个场景
4.3 中介者模式实践
4.4 中介者案例分析
中介者模式可以使对象之间的关系数量急剧减少。中介者承担两方面的职责:
- 中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。该中转作用属于中介者在结构上的支持。
- 协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。该协调作用属于中介者在行为上的支持。
05.中介者模式分析
5.1 中介者模式优点
中介者模式的优点
- 简化了对象之间的交互。
- 将各同事解耦。
- 减少子类生成。
- 可以简化各同事类的设计和实现。
5.2 中介者模式缺点
中介者模式的缺点
- 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
5.3 使用建议说明
5.5 适用场景
- 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时,可使用中介者模式。
- 当想创建一个运行于多个类之间的对象,又不想生成新的子类时,可使用中介者模式。
- 当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。