第19章 行为型模式—中介者模式

1. 中介者模式(Mediator Pattern)的定义

(1)定义:用一个中介对象来封装一系统对象交互。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

     

  ①中介者模式主要用来将同事类之间网状结构变为星状结构,使同事类之间的关系变的清晰一些。

  ②所有对象只跟中介者对象进行通信,相互之间不再有联系,这样也能够集中控制这些对象的交互关系

(2)中介者模式的结构和说明

  ①Mediator: 中介者接口。在里面定义各个同事之间交互需要的方法,可以是公共的通信方法,比如changed方法,大家都可以用(一般会传入同事类的this指针),也可以是小范围的交互方法。

  ②ConcreteMediator:具体中介者实现对象。这需要了解并维扩各个同事对象,并负具体的协调各同事对象的交互关系。

  ③Colleague:同事类的定义,通常实现为抽象类,主要负责约束同事对象的类型,并能实现一些具体同事类之间的公共功能。同时,一般会持有中介者的引用

  ④ConcreteColleague:具体的同事类,实现自己的业务,在需要与其他同事通信的时候,就与持有的中介者通信,中介者会负责与其他的同事交互。

2. 思考中介者模式

(1)中介者模式的本质封装交互。中介者的目的,就是用来封装多个对象的交互,这些交互的处理多在中介者对象里面实现。只要是实现封装对象之间的交互功能,就可用中介者模式,而不必过于拘泥于中介者模式本身的结构。

(2)需要Mediator接口吗

  这取决于是否会提供多个不同的中介者实现。如果中介者实现只有一个的话,而且预计中也没有扩展的需求,那就可以不定义Mediator接口。如果中介者实现不只一个,或者预计有扩展的要求,那么就需要定义Mediator接口。让各个同事类来面向中介者接口编程。

(3)同事关系

  在标准的中介者模式中,将使用中介者对象来交互的那些对象称为同事类,在中介者模式中要求这些类都要继承相同的类,也就是说,这些对象从某个角度来讲是同一个类型,算是兄弟对象。

(4)同事和中介者的关系

  ①当一个同事对象发生了改变,需要主动通知中介者,让中介者去处理与其他同事对象相关的交互。

  ②同事对象需要知道中介者对象是谁,反过来,中介者对象也需要知道相关的同事对象,这样才能与同事对象进行交互。

  ③中介者对象与同事对象之间是相互依赖的。

(5)如何实现同事和中介者的通信

  ①同事类持有中介者对象,可以通过Mediator接口中定义一个特殊的通知接口(如changed),并把this当做参数传入,这样在中介者对象里面,就可以去获取这个同事对象的实例或当中的数据了。中介者对象里面记录着各个同事,会根据从changed接口中传入来的对象,判断下一步的动作。

  ②另一种实现方式可以采用观察者模式,把Mediator实现成为观察者,而各个同事类实现成为Subject,这样同事类发生了改变,会通知Mediator。Mediator在接到通知的以后,会与相应的同事对象进行交互。

3. 广义的中介者

(1)标准中介者模式的问题

  ①同事对象都要从一个公共的父类继承。在这实际开发中,很多相互交互的对象本身是没有公共父类的,强行加上一个父类,会让这些对象实现起来特别别扭。

  ②同事类必须持有中介者对象吗?在标准的中介者模式中,中介者对象作为属性并通过构造方法注入到同事类中的。而实际开发中,可以把中介者对象做成单例,直接在同事类的方法里面去调用中介者对象,而无须将中介者作为同事类的成员变量。

  ③在实际开发中,很常见的情况是不需要中介者接口的,而且中介者对象也不需要创建多个实例。因为中介者是用来封装和处理同事对象的关系的,它一般被实现为单例。

  ④中介者对象是否需要持有所有的同事?在标准的中介者模式中会将所有的同事类作为成员变量(或保存在链表中)这是一种很强的依赖关系。在实现中,可以在中介者处理的方法里面去创建或获取,或者从参数传入需要的同事对象

  ⑤中介者对象只是提供一个公共的方法来接受同事对象的通知吗?在标准的中介者中只提供一个公共方法,这样还是要去区分到底是哪个同事类发过来的通知。在实际的开发中,通常会提供具体的业务通知方法,这样就不用再去判断到底是什么对象,其具体的什么业务了。

(2)广义的中介者模式(也是简化的中介者模式)

  ①通常去掉同事对象的父类,这样可以让任意对象,只要需要相互交互,就可以成为同事。

  ②通常不定义Mediator接口,把具体的中介者对象实现成单例。

  ③同事对象不再持有中介者,需是在需要的时候直接获取中介者对象并调用;中介者也不再持有同事对象,而是在具体的处理方法里面去创建或者获取,或者从参数传入需要的同事对象。

4. 中介者模式的优缺点

(1)优点

  ①松散耦合:中介者把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互不依赖。这样同事对象可以独立变化和复用。

  ②集中控制:多个同事对象的交互被封装在中介者对象里面集中管理地,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了。

  ③多对多变一对多的关系

(2)缺点

  ①潜在的过度集中化。如果同事对象的交互非常多,而且比较复杂。当这些复杂性全部集中到中介者的时候,会导致中介者对象变得十分复杂,难于管理和维护。

  ②由于“中介“承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。

5. 中介者的应用场景

(1)同事类之间是网状结构的关系,可以考虑使用中介者模式。它会将网状结构变为星状结构,使同事类之间的关系变的清晰一些。

(2)一个对象引用很多对象,并直接跟这些对象交互,导致难以复用该对象,可以采用中介者模式,把这个对象跟其他对象的交互封装到中介者对象里面。

6. 相关模式

(1)中介者模式与外观模式

  ①外观模式多用来封装一个子系统内部的多个模式,目的是向子系统外部提供简单易用的接口。也就是说外观模式封装的是子系统外部和子系统内部模块间的交互。而中介者模式是提供多个平等的同事对象之间交互关系的封装,一般是用在内部实现上。

  ②外观模式的实现是单向的交互,是从子系统外部来调用子系统内部,不会反着过来;而中介者模式实现是内部多个模块间多向的交互

(2)中介者模式和观察者模式

  中介者模式可以结合观察者模式来实现当同事对象发生改变的时候,通知中介对象,让中介对象去进行与其他相关对象的交互。

时间: 2024-08-03 22:14:19

第19章 行为型模式—中介者模式的相关文章

设计模式-行为型模式-中介者模式

中介者要解决的问题 中介者模式(Mediator Pattern)是用来降低多个对象和类之间通信的复杂度.这种模式提供了一个中介类,该类通常用来处理不同类之间的通信.中介者模式符合迪米特原则,即一个类应当尽量减少与其他类的联系. 实例描述 在我们现实生活中就有这样的例子,你如果去租房,你可能会在网站上找一些发布租房的信息,找到对应的房东.为了能够找到性价比高的房子,你可能找好多家,那么你都要和这些房东打交道,留下电话啥的.有时候房子不好出租的情况下,房东还会主动联系你,就有了下面这幅图: 我们可

行为型模型 中介者模式

行为型模型 中介者模式 Mediator抽象中介者         中介者类的抽象父类. concreteMediator         具体的中介者类. Colleague         关联类的抽象父类. concreteColleague         具体的关联类. 适用于:         用一个中介对象,封装一些列对象(同事)的交换,中介者是各个对象不需要显示的相互作用,从而实现了耦合松散,而且可以独立的改变他们之间的交换. /** * 行为型模型 中介者模式 * Mediat

Java设计模式(十一)访问者模式 中介者模式

(二十一)访问者模式 对已存在的类进行扩展,通常需要增加方法,但是如果需要的行为与现有的对象模型不一致,或者无法修改现有代码.在这种情况下,不更改类的层次结构,就无法扩展该层次结构的行为.如果运用了访问者模式,就可以支持开发人员扩展该类层次结构的行为. 和解释器模式一样,访问者模式通常是基于合成模式的. 访问者模式在不改变类层次结构的前提下,对该层次结构进行扩展. interface Visitor{ public void visit(VisiSubject sub); } interface

java设计模式--行为型模式--中介者模式

怎么理解中介者模式,我姑且用房产中介来理解吧.呵呵 中介者模式: 1 中介者模式 2 概述 3 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 4 5 6 适用性 7 1.一组对象以定义良好但是复杂的方式进行通信.产生的相互依赖关系结构混乱且难以理解. 8 9 2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象. 10 11 3.想定制一个分布在多个类中的行为,而又不想生成太多的子类. 12 13

设计模式(行为型)之中介者模式(Mediator Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之职责链模式(Chain of Responsibility Pattern)>http://blog.csdn.net/yanbober/article/details/45531395 概述 如果对象之间的联系呈现为网状结构,存在大量的多对多联系,在网状结

&quot;围观&quot;设计模式(25)--行为型之中介者模式(Mediator Pattern)

用一个对象封装一系列的对象交互,中介者使对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的独立. 个人理解 当多个对象之间存在着过多的耦合时,可以通过中介者模式进行解耦,将具体的对象之间的耦合转为中介者与具体对象的耦合,假如说之前是三个对象的相互之间的耦合,转为中介者与具体类的耦合之后,从耦合性上大大的降低了,这样如果再来对其进行修改的话,那么变更部分主要在中介者部分,从而使得该结构更加稳定. 角色分析 中介者角色分以下几个部分: 1. Mediator抽象中介者角色:抽象

大话设计模式笔记 职责链模式 中介者模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 优点:当客户提交一个请求是,请求是沿链传递直至有一个ConcreteHandler对象负责处理它. 接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构.结果是职责链可以简化对象的相互连接. 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互.中介者使各对

行为模式——中介者模式

1.模式动机 2.模式定义 3.模式结构 4.模式分析 5.实例: 视频链接:B站审核中.... 原文地址:https://www.cnblogs.com/ymym/p/12690400.html

设计模式——行为型模式之中介者模式(七)

中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 介绍 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应