1. 模式定义⭐️🔴

又叫调停模式,定义一个中介者角色来封装一系列对象之间的交互,让各个对象不需要显式地相互引用,将原有对象之间的耦合松散,且可以独立地改变它们之间的交互。❕%%
1737-🏡⭐️◼️用一个中介对象来封装不同对象之间的交互,使得各个不同对象无需显示的调用,耦合度降低,同时可以更加方便的维护他们之间的交互逻辑◼️⭐️-point-202301251737%%

2. 模式结构

2.1. 模式角色

  • 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  • 具体中介者(ConcreteMediator)角色:实现中介者接口,聚合抽象同事类定义一个 集合(List或者HashMap) 来管理同事对象,并接受某个同事对象消息,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  • 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。聚合抽象中介者,并构造导入,以便具体同事类能调用具体中介者类中的方法。
  • 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

2.2. UML

image.png

2.3. 实现逻辑⭐️🔴

  1. 具体中介者类ConcreteMediator聚合抽象同事类Colleague,并用一个集合管理它的子类
  2. 抽象同事类Colleague聚合抽象中介者Mediator,并构造导入,使其子类可以传入Client配置的具体中介者类,从而子类可以调用具体中介者类的方法。❕%%
    2022-🏡⭐️◼️中介者模式核心逻辑?具体中介者类聚合+集合管理抽象同事类,抽象同事类聚合+构造导入抽象中介类,这样它的子类(比如ContreteColleague)创建时就可以传入具体中介者类ContreteMediator,从而可以调用其方法◼️⭐️-point-202301252022%%

3. 案例分析⭐️🔴

3.1. 智能家居 ✅

  1. 智能家庭包括各种设备,闹钟、咖啡机、电视机、窗帘 等
  2. 主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为:闹铃响起->咖啡机开始做咖啡->窗帘自动落下->电视机开始播放

3.1.1. UML

image.png

3.1.2. 实现逻辑⭐️🔴

  1. 抽象同事类聚合抽象中介者类,并构造导入,使得抽象同事类的子类可以构造传入Client指定的具体中介者类,并调用具体中介者类中的方法
  2. 具体中介者类聚合抽象同事类,并将其子类放入集合中管理,以便在其内部完成消息的转发

3.1.3. 示例代码

[[ConcreteMediator.java]]

3.2. 租房

现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。

3.2.1. UML

3.2.2. 实现逻辑⭐️🔴

  1. 具体中介者聚合抽象同事类或者所有具体同事类,该例子中具体同事类较少,直接作为成员变量了,没有使用集合进行管理
  2. 抽象同事类聚合抽象中介类,以便能调用具体中介类中的方法 ❕%%
    1730-🏡⭐️◼️租房案例中的核心逻辑?具体中介类聚合了2个具体同事类,没有使用集合,只作为成员变量来管理;抽象同事类聚合了抽象中介类,以便抽象同事类的子类,具体同事类调用具体中介类中的方法◼️⭐️-point-202301251730%%

3.2.3. 示例代码

[[pages/002-schdule/001-Arch/001-Subject/013-DemoCode/design_patterns/src/main/java/com/itheima/pattern/mediator/MediatorStructure.java]]

4. 适用场景⭐️🔴

  • 系统中对象之间存在复杂的引用关系,系统结构混乱且难以理解。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时

5. 优缺点⭐️🔴

1. 优点:

  1. 松散耦合
    中介者模式通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互不依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一处而动全身”了。

  2. 集中控制交互
    多个同事对象的交互,被封装在中介者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改中介者对象就可以了,当然如果是已经做好的系统,那么就扩展中介者对象,而各个同事类不需要做修改。

  3. 一对多关联转变为一对一的关联
    没有使用中介者模式的时候,同事对象之间的关系通常是一对多的,引入中介者对象以后,中介者对象和同事对象的关系通常变成双向的一对一,这会让对象的关系更容易理解和实现。❕%%
    2035-🏡⭐️◼️中介模式的优缺点:优点:同事类之间松耦合,交互逻辑封装到中介者类中,不会出现牵一发事故;通过中介者模式控制交互逻辑,无需改动同事类;同事类之间一对多的关系改为双向的一对一关系,逻辑更清晰。缺点:中介者类责任越来越大,容易出现问题;越来越难维护◼️⭐️-point-202301252035%%

2. 缺点:

1. 当同事类太多时,中介者的职责将很大,一旦中介者出现了问题,整个系统就会受到影响.
2. 它会变得复杂而庞大,以至于系统难以维护。

6. JDK源码分析

7. 实战经验

8. 参考与感谢

设计模式-2、设计模式及设计原则