中介者(Mediator)模式
# 中介者(Mediator)模式
利用中介者将网状变为星状关系

中介者模式 (Mediator Pattern):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,减少对象间混乱的依赖关系,从而使其耦合松散,而且可以独立地改变它们之间的交互。对象行为型模式。

- 中介者模式(Mediator Pattern),用一个 中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其 耦合松散,而且可以独立地改变它们之间的交互
- 中介者模式属于行为型模式,使代码易于维护
- 比如 MVC 模式,C(Controller 控制器)是 M(Model 模型)和 V(View 视图)的中介者,在前后端交互时起到了中间人的作用
Mediator: 抽象中介者
此次没有定义
ConcreteMediator: 具体中介者
/**
* 塔台:中介者
*/
public class ControlTower {
private boolean canDo = true; // 接受请求
public void acceptRequest(Captain captain, String action) {
if ("fly".equals(action) || "land".equals(action)) {
if (canDo == true) {
System.out.println("允许....");
canDo = false;
} else {
System.out.println("禁止....");
}
}
if ("success".equals(action)) {
canDo = true;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Colleague: 抽象同事类
public abstract class Captain {
ControlTower controlTower = new ControlTower();
// 起飞
abstract void fly();
//降落
abstract void land();
//完成
abstract void success();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
ConcreteColleague: 具体同事类
public class HU8778 extends Captain{
ControlTower controlTower;
public void setControlTower(ControlTower controlTower) {
this.controlTower = controlTower;
}
@Override
void fly() {
System.out.println("HU8778 请求起飞....");
controlTower.acceptRequest(this,"fly");
}
@Override
void land() {
System.out.println("HU8778 请求降落....");
controlTower.acceptRequest(this,"land");
}
@Override
void success() {
System.out.println("完成");
controlTower.acceptRequest(this,"success");
}
}
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
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
public class SC8633 extends Captain {
ControlTower controlTower;
public void setControlTower(ControlTower controlTower) {
this.controlTower = controlTower;
}
@Override
void fly() {
System.out.println("SC8633 请求起飞....");
controlTower.acceptRequest(this, "fly");
}
@Override
void land() {
System.out.println("SC8633 请求降落....");
controlTower.acceptRequest(this, "land");
}
@Override
void success() {
System.out.println("完成");
controlTower.acceptRequest(this, "success");
}
}
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
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
测试
public class MainTest {
public static void main(String[] args) {
HU8778 hu8778 = new HU8778();
SC8633 sc8633 = new SC8633();
ControlTower controlTower = new ControlTower();
hu8778.setControlTower(controlTower);
sc8633.setControlTower(controlTower);
hu8778.fly();
sc8633.fly();
hu8778.success();
sc8633.fly();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 应用场景
什么场景用到?
- SpringMVC 的 DispatcherServlet 是一个中介者,他会提取 Controller、Model、View 来进行调用。而无需 controller 直接调用 view 之类的渲染方法
- 分布式系统中的网关
- 迪米特法则的一个典型应用
- 中介者和外观(门面)模式区别?
- 中介者双向操作,门面偏向于封装某一方
# 注意事项和细节
- 多个类相互耦合,会形成网状结构,使用中介者模式将网状结构分离为星型结构,进行解耦
- 减少类间依赖,降低了耦合,符合迪米特原则
- 中介者 承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
- 如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02