中介者模式

中介者模式的概念

中介者模式(Mediator Pattern) 又被称为调解者模式,中介者模式主要是用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而实现耦合松散,而且可以独立的改变他们之间的交互。通常来说中介者模式就是​​减少对象之间混乱无序的依赖关系。​​中介者模式在类的创建过程中属于行为型模式。 中介者模式是迪米特法则的典型应用。

中介者模式包装了一系列对象的相互作用的方法,使得这些对象不必相互明显的影响,从而使他们耦合。当某些对象之间的作用发生了改变,不会立即影响到其他对象的作用,保证这些对象的的作用可以独立变化。​​其核心思想是通过中介者模式解耦系统各层次对象的直接耦合,层次对象的对外依赖一律交给中介者进行转发。​

中介者模式的应用场景

在现实生活中,中介者模式是必不可少的一种模式,如果没有中介者我们就无法与远方的朋友或者亲戚交流等场景使用

  • 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
  • 当想创建一个运行于多个类之间的对象,又不想生成新的子类时。

中介者模式的通用写法

通常情况下中介者模式一般分为以下主要角色

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

下面通过飞机和机台起飞交流案例来展示中介者模式的通用写法

  • Captain(抽象中介者角色)
public abstract class Captain {
abstract void fly();
abstract void land();

abstract void success();
}
  • ControlTower(具体中介者模式)
public class ControlTower {
private boolean canDo = true;

public void acceptRequest(Captain captain, String action) {

if ("fly".equals(action) || "lang".equals(action)) {
if (canDo) {
System.out.println("允许");
canDo = false;
} else {
System.out.println("不允许");
}
}
if ("success".equals(action)) {
canDo = true;
}

}
}
  • Hu8778(具体同事角色1)
public class Hu8778  extends Captain{

ControlTower controlTower;

public void setControlTower(ControlTower controlTower) {
this.controlTower = controlTower;
}

@Override
void fly() {
System.out.println("hu请求起飞");
controlTower.acceptRequest(this,"fly");
}

@Override
void land() {
System.out.println("hu请求降落");
controlTower.acceptRequest(this,"land");
}

@Override
void success() {
System.out.println("hu请求完成");
controlTower.acceptRequest(this,"success");
}
}
  • Sc8663(具体同事实现2)
public class Sc8663  extends Captain{

ControlTower controlTower;

public void setControlTower(ControlTower controlTower) {
this.controlTower = controlTower;
}
@Override
void fly() {
System.out.println("sc请求起飞");
controlTower.acceptRequest(this,"fly");
}

@Override
void land() {
System.out.println("sc请求降落");
controlTower.acceptRequest(this,"land");
}

@Override
void success() {
System.out.println("sc请求完成");
controlTower.acceptRequest(this,"success");
}
}
  • UML结构图

中介者模式_中介者

通过上述代码和UML结构图可知,首先建立抽象类Captain,里面定义了飞机通用方法fly、land等方法,然后定义一个中介者类,通过定义acceptRequest方法中判断是否允许fly方法或者lang方法,如果存在则进行分别处理。然后定义三台飞机类同时继承Captain方法,并重写属于自己的方法。最后飞机和卡塔之间相互交互是否起飞、等待等方法。

中介者模式的优缺点

优点

  • 类之间各司其职,符合迪米特法则。
  • 降低了对象之间的耦合性,使得对象易于独立地被复用。
  • 将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

缺点

  • 中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。