Design Patterns(十七) Mediator

Mediator pattern is used to reduce communication complexity between multiple objects or classes. This pattern provides a mediator class which normally handles all the communications between different classes and supports easy maintenance of the code by loose coupling. Mediator pattern falls under behavioral pattern category.

前言

    中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介者模式

基本介绍:

1) 中介者模式(Mediator Pattern ),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互;
2) 中介者模式属于行为型模式,使代码易于维护;
3) 比如MVC模式,C(Controller控制器)是M(Model模型)和V(View视图)的中介者,在前后端交互时起到了中间人的作用。

角色介绍:

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

中介者模式-UML图:


代码:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import java.util.HashMap;
import java.util.Map;

/**
* @Auther: Arsenal
* @Date: 2020-03-20 23:12
* @Description: 中介者模式
*/
public class MediatorDemo {
public static void main(String[] args) {
// 获取中介者对象
Mediator m = new President();
// 获取同事对象,实例化的时候会在中介者对象中注册
Market market = new Market(m);
Development devp = new Development(m);
Financial f = new Financial(m);

//后面就可以用m来实施指挥调动了
}
}

/**
* 中介者接口
*/
interface Mediator {

/**
* 注册 同事
* @param dname
* @param d
*/
void register(String dname, Department d);

/**
* 执行 处理
* @param dname
*/
void command(String dname);
}


/**
* 中介者实现类
*/
class President implements Mediator {

private Map<String, Department> map = new HashMap<String, Department>();

@Override
public void command(String dname) {
map.get(dname).selfAction();
}

@Override
public void register(String dname, Department d) {
map.put(dname, d);
}
}

/**
* 抽象同事类
*/
interface Department {
void outAction();

void selfAction();
}

/**
* 具体同事类
*/
class Market implements Department {

private Mediator m; //持有中介者(总经理)的引用

public Market(Mediator m) {
super();
this.m = m;
m.register("market", this);
}

@Override
public void outAction() {
System.out.println("汇报工作!项目承接的进度,需要资金支持!");
m.command("finacial");

}

@Override
public void selfAction() {
System.out.println("跑去接项目!");
}
}

/**
* 具体同事类
*/
class Financial implements Department {

private Mediator m; //持有中介者(总经理)的引用

public Financial(Mediator m) {
super();
this.m = m;
m.register("finacial", this);
}

@Override
public void outAction() {
System.out.println("汇报工作!没钱了,钱太多了!怎么花?");
}

@Override
public void selfAction() {
System.out.println("数钱!");
}
}

/**
* 具体同事类
*/
class Development implements Department {

private Mediator m; //持有中介者(总经理)的引用

public Development(Mediator m) {
super();
this.m = m;
m.register("development", this);
}

@Override
public void outAction() {
System.out.println("汇报工作!没钱了,需要资金支持!");
}

@Override
public void selfAction() {
System.out.println("专心科研,开发项目!");
}
}

总结

中介者模式的注意事项和细节:

1) 多个类相互耦合,会形成网状结构, 使用中介者模式将网状结构分离为星型结构,进行解耦;
2) 减少类间依赖,降低了耦合,符合迪米特原则;
3) 中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响;
4) 如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意。

延伸

    中介者模式(Mediator)
    中介者模式-菜鸟教程
    中介者模式简介及使用示例
    Design Patterns - Mediator Pattern
    尚硅谷Java设计模式,韩顺平图解java设计模式

Content
  1. 1. 前言
  2. 2. 中介者模式
  3. 3. 总结
  4. 4. 延伸