中介者模式(Mediator Pattern)

一、概念

中介者模式(Mediator Pattern)又称为调节者模式或者调停者模式,定义了一个中介对象来封装一系列对象之间的交互关系,从而使各个对象之间不需要显式地相互引用,达到松耦合的目的。使得当某些对象之间的功能发生改变时,不会立刻影响其他的一些对象之间的功能。

  • 核心思想:通过中介者对象解耦各层级对象的直接耦合,层级对象的对外依赖全部交由中介者转发。
  • 简单来说: 对象之间不直接交互,通过中介者来进行交互

二、适用场景

中介者模式在日常生活中非常常见,比如租房中介,买房中介等,还有像我们的群聊,聊天室等等都有中介者的身影。中介者模式主要适用于以下场景:

  1. 系统中的对象存在非常复杂的引用关系,而且相互依赖,导致依赖关系非常复杂时。
  2. 当我们想要使用多个类之间的行为(功能)时,为了避免过多的使用继承,可以考虑使用中介者来实现。

三、参与者

  • 抽象中介者(AbstractMediator):定义一个抽象角色,定义了各同事对象之间交互需要的方法
    • 抽象中介者: 定义一个接口用于与各同事对象通信
  • 抽象对象(Object):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维护了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信,从而通过中介者角色进行通信转发
    • 抽象同事类, 定义各同事的公有方法
  • 具体中介者(ConcreteMediator):实现抽象中介者的方法,它需要知道所有的具体同事类(维护所有的同事)。然后从具体同事对象接收消息,并向具体同事对象发出命令,以协调各个同事对象之间通信协作
    • 了解维护它的各个同事;
    • 通过协调各同事对象实现协作行为(从同事接收消息, 向具体同事发出命令).
    • 如果不存在扩展情况, 那么抽象中介者可与具体中介者(合二为一.
  • 具体对象 (ConcreteObject) :每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法
    • 负责实现自发行为(Self-Method),转发依赖方法(Dep-Method)交由中介者进行协调处理(如示例中的ServiceA和ServiceB,自发行为就是方法doSomething()方法,转发行为对应callA()和callB()方法)。
    • 每一个同事类都知道它的中介者对象.
    • 每一个同事对象在需与其他同事通信时, 与它的中介者通信.
  • Client 用户

四、代码例子

以二手车交易为例子,分别有宝马、奔驰车卖家,宝马、奔驰车买家四个对象存在,通过汽车交易中介进行消息交流,卖家告诉中介我要卖车,中介通知买家有人卖车。

  • 抽象中介者(AbstractMediator):Mediator
  • 抽象对象(Object):Person
  • 具体中介者(ConcreteMediator):ConcreteMediator2ndCarSalesShop
  • 具体对象 (ConcreteObject):ConcreteBMWCustomer、ConcreteBenzCustomer、ConcreteBMWSeller、ConcreteBenzSeller

五、UML图

 

六、优缺点

(一)优点

  1. 各个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,各个类都各司其职,符合了迪米特法则。

  2. 减少了类之间的相互依赖性,将多对多依赖转化成为了一对多依赖,降低了类间的耦合。
    • 将原先多对多的同事对象关系变成中介者对象一对多同事对象的关系,这样会让对象之间的关系更容易理解和实现
  3. 由于同事对象之间的交互都被封装到中介者对象里面集中管理。当交互发生改变时,着重修改的是中介者对象。当需要扩展中介者对象时,其他同事对象不需要做修改。

(二)缺点

  1. 当我们的同事角色非常多的时候,中介者对象需要维护非常多的同事角色对象,会使得中介者变得非常庞大,导致难以维护。

七、与其他模式比较

(一)中介者模式与外观模式、代理模式的区别

中介者模式和外观模式、代理模式比较类似,但是又有不同。

  • 和外观模式比较:中介者模式中,同事类必须依赖与中介者,中介者也知道同事类;而外观模式中,子系统是不需要知道外观类的存在,并且子系统是可以脱离外观模式的
  • 和代理模式比较:代理模式的核心就是代理作用,主要还是对原先的类进行扩展或增加功能;而中介者模式主要目的是为了减少对象之前的耦合,也就是同事类直接相互独立,互不影响

(二)中介者模式和桥接模式的区别

  • 桥接模式侧重的是将抽象和具体进行解耦,一般就是特指2个维度,一个抽象,一个具体。

  • 中介者模式侧重的是通过中介者将多个相同类型对象之间的关联关系进行统一管理。
posted @ 2022-12-15 14:01  ImreW  阅读(50)  评论(0编辑  收藏  举报