中介者模式是一种行为型设计模式,它的目的是通过增加一个中介对象,解除对象与对象之间的紧耦合关系.

增加中介对象后,所有的相关对象都通过中介对象来通信,而不是互相引用,所有当一个对象发生改变时,只需要通知中介者对象即可.

mediator-pattern22.png

使用场景

中介模式可以很好的将对象之间进行解耦,如果对象之间的复杂耦合导致调用和维护出现困难,而且这些耦合随项目的变化呈指数增加,则可以考虑使用中介者模式重构代码.

缺陷

系统中新增一个中介者对象,所有对象之间交互的复杂性都转移为中介者对像的复杂度.这会使得中介者对象经常巨大,往往成为难以维护的对象.而且新增的对象会占用一部分系统资源.

如果对象之间的复杂度是可以控制的,并且不会随着对象增加而增加它们的维护难度,则没有必要使用中介者模式.

例子

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
// 购买手机 界面.
// 用户选择颜色、内存等信息 界面给出对应的提示
var goods = {
"red|32G": 3,
"red|16G": 0,
"blue|32G": 1,
"blue|16G": 6
}

var mediator = (function () {
var colorSelect = document.getElementById('colorSelect'),
memorySelect = document.getElementById('memorySelect'),
colorInfo = document.getElementById('colorInfo'),
numberInput = document.getElementById('numberInput'),
memoryInfo = document.getElementById('memoryInfo'),
numberInfo = document.getElementById('numberInfo'),
nextBtn = document.getElementById('nextBtn');
return {
changed (obj) {
var color = colorSelect.value,
memory = memorySelect.value,
number = numberInput.value,
stock = goods[color+'|'+memory];
if(obj === colorSelect) {
colorInfo.innerHTML = color;
} else if (obj === numberInput) {
memoryInfo.innerHTML = memory;
} else if (obj === numberInput) {
numberInfo.innerHTML = number;
}

if (!color) {
nextBtn.disabled = true;
nextBtn.innerHTML = '请选择手机颜色';
return;
}
if (!memory) {
nextBtn.disabled = true;
nextBtn.innerHTML = '请选择内存大小';
return;
}

if(Number.isInteger(number - 0) && number > 0) {
nextBtn.disabled = true;
nextBtn.innerHTML = '请输入正确的购买数量';
return;
}

nextBtn.disabled = false;
nextBtn.innerHTML = '放入购物车';
}
}
})

colorSelect.onchange = function () {
mediator.change(this);
}

memorySelect.onchange = function () {
mediator.change(this);
}

numberInput.onchange = function () {
mediator.change(this);
}