加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

23种设计模式之中介者模式

发布时间:2020-12-13 20:56:57 所属栏目:百科 来源:网络整理
导读:中介者模式的定义 中介者模式,当多个类彼此关联,会增大耦合性,这时各个模块通过中介者进行交流,每个模块只负责自己的业务逻辑,不属于自己的就丢给中介者,降低耦合 定义: 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦

中介者模式的定义

中介者模式,当多个类彼此关联,会增大耦合性,这时各个模块通过中介者进行交流,每个模块只负责自己的业务逻辑,不属于自己的就丢给中介者,降低耦合

定义: 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互.

通用类图如下:

23种设计模式之中介者模式

由以下几部分组成:

  1. AbstractMediator 抽象中介者: 抽象中介者角色定义统一的接口,用于各同事角色之间的通信.
  2. Mediator 具体中介者: 具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖各个同事角色
  3. AbstractColleague 抽象同事角色: 每一个同事角色都知道中介者角色,而且与其他同事通信的时候,一定要通过中介者角色协作.每个同事类的行为分为两种: 一种是同事本身的行为,叫做自发行为,与其他的同事类或中介者没有任何的依赖; 第二种是必须依赖中介者才能完成的行为,叫做依赖方法

抽象中介者代码:

23种设计模式之中介者模式

具体中介者代码:

23种设计模式之中介者模式

抽象同事类代码:

23种设计模式之中介者模式

这个类代码非常简单,就是为了建立这个中介而服务的

具体同事类代码:

23种设计模式之中介者模式

为什么同事类要使用构造函数注入中介者,而中介者使用 getter/setter 方式注入同事类呢? 这是因为同事类必须拥有中介者,而中介者却可以只有部分同事类.

中介者模式的应用

中介者模式的优点:

减少了类间的依赖,把原有的一对多的以来变成了一对一的依赖,同事类只依赖中介者,减少了依赖,当然同时也降低了类间的耦合

中介者模式的缺点:

中介者会膨胀得很大,而且逻辑复杂,原本N个对象直接的相互依赖关系转换成中介者和同事类的依赖关系,同事类越多,中介者的逻辑就越复杂.

中介者模式的使用场景:

中介者模式适用于多个对象之间紧密耦合的情况,紧密耦合的标准是: 在类图中出现了蜘蛛网状结构. 在这种情况下一定要考虑使用中介者模式,这有利于把蜘蛛网梳理为星型结构,使原本复杂混乱的关系变得清晰简单

中介者模式的实际应用

中介者模式也叫调停者模式,什么意思呢? 一个对象要和N多个对象交流,就像对象间的战争,很混乱. 这时需要加入一个中心,所有的类都和中心交流,中心说怎么处理就怎么处理.举一些常见的例子:

1.机场调度中心.

在每个机场都会看到有一个"XX机场调度中心",他就是具体的中介者,用来调度每一架要降落和起飞的飞机.如果没有机场调度中心,飞机飞到机场了,飞行员要先看看有没有飞机和自己一起降落,有没有空跑道灯,这是在难以想象.

2.MVC框架

MVC框架其中的 C(Controller)就是一个中介者,叫做前端控制器,它的作用就是把M(Model,业务逻辑)和V(View,视图)隔离开,协调M和V协同工作,把M运行的结果和V代表的视图融合成一个前端可以展示的页面,减少M和V的依赖关系.

3.媒体网关

媒体网关也是一个典型的中介者模式,比如使用MSN时,张三发消息给李四,其过程应该是这样的: 张三发送消息,MSN服务器(中介者)接收到消息,查找李四,把消息发送到李四,同时通知张三,消息已经发送. 在这里,MSN服务器就是一个中转站,负责协调两个客户端的信息交流.

4.中介服务

现在中介服务非常多,如租房中介等,这些也是中介模式的具体体现.


中介者模式很少用到接口或者抽象类,这与依赖倒置原则是冲突的,这是为什么呢? 首先,既然是同事类而不是兄弟类(有相同的血缘),那就说明这些类之间是协作关系,完成不同的任务,处理不同的业务,所以不能在抽象类或接口中严格定义同事类必须具有的方法(从这点也可以看出继承是高侵入性的).

一个 中介者抽象类一般只有一个实现类,除非中介者逻辑非常复杂,代码量非常大,这时才会出现多个中介者的情况. 对于中介者来说,抽象已经没有太多的必要.

中介者模式也不要滥用,可以在如下情况下尝试使用中介者模式:

  1. N个对象之间产生了相互的依赖关系(N>2)
  2. 多个对象有依赖关系,但是依赖的行为尚不确定或者有发生改变的可能,在这种 情况下一般建议采用中介者模式,降低变更引起的风险扩散
  3. 产品开发. 一个明显的例子就是MVC框架,把中介者模式应用到产品中,可以提升产品的性能和扩展性,但是对于项目开发就未必,因为项目是以交付投产为目标,而产品是以稳定、高效、扩展为宗旨.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读