中介者模式

常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是网状结构,它要求每个对象都必须知道它需要交互的对象。若把这种网状结构改为星形结构的话,将大大降低它们之间的耦合性,这时只要找一个中介者就可以了。

定义一个中介对象来封装一系列对象之间的交互,中介者使各对象不需要显示地相互作用 ,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用

实现

中介者模式由抽象中介者具体中介者抽象同事具体同事几个主要角色。

抽象中介者:定义统一的接口, 用于各同事角色之间的通信

1
2
3
4
5
6
7
8
9
10
@Data
public abstract class Mediator {
//定义同事类
protected ConcreteColleague1 c1;
protected ConcreteColleague2 c2;
//中介者模式的业务逻辑
public abstract void doSomething1();

public abstract void doSomething2();
}

具体中介者:通过协调各同事角色实现协作行为, 因此它必须依赖于各个同事角色

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ConcreteMediator extends Mediator {
@Override
public void doSomething1() {
super.c1.selfMethod1();
super.c2.selfMethod2();
}

@Override
public void doSomething2() {
super.c1.selfMethod1();
super.c2.selfMethod2();
}
}

抽象同事类:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能

1
2
3
4
5
6
7
public abstract class Colleague {
protected Mediator mediator;

public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}

具体同事类:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互,每个同事角色都知道中介者角色, 且与其他同事角色通信时, 一定要通过中介者角色协作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}

public void selfMethod1() {
//处理自己的业务逻辑
}

public void depMethod1() {
//处理自己的业务逻辑
//自己不能处理的业务逻辑, 委托给中介者处理
super.mediator.doSomething1();
}
}

public class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}

public void selfMethod2() {
//处理自己的业务逻辑
}

public void depMethod2() {
//处理自己的业务逻辑
//自己不能处理的业务逻辑, 委托给中介者处理
super.mediator.doSomething2();
}
}

优点

类之间各司其职,符合迪米特法则

降低了对象之间的耦合性,使得对象易于独立地被复用

将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展

缺点

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

应用

MVC框架中,控制器(C)就是模型(M)和视图(V)的中介者。