中介者模式

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

中介者模式

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
// 定义中介者
interface Mediator {
notify(sender: object, event: string): void;
}
// 具体实现中介者
class ConcreteMediator implements Mediator {
private component1: Component1;

private component2: Component2;

constructor(c1: Component1, c2: Component2) {
this.component1 = c1;
this.component1.setMediator(this);
this.component2 = c2;
this.component2.setMediator(this);
}

public notify(sender: object, event: string): void {
if (event === 'A') {
console.log('Mediator reacts on A and triggers following operations:');
this.component2.doC();
}

if (event === 'D') {
console.log('Mediator reacts on D and triggers following operations:');
this.component1.doB();
this.component2.doC();
}
}
}
// 定义基础组件类
class BaseComponent {
protected mediator: Mediator;

constructor(mediator?: Mediator) {
this.mediator = mediator!;
}

public setMediator(mediator: Mediator): void {
this.mediator = mediator;
}
}
// 实现具体组件
class Component1 extends BaseComponent {
public doA(): void {
console.log('Component 1 does A.');
this.mediator.notify(this, 'A');
}

public doB(): void {
console.log('Component 1 does B.');
this.mediator.notify(this, 'B');
}
}

class Component2 extends BaseComponent {
public doC(): void {
console.log('Component 2 does C.');
this.mediator.notify(this, 'C');
}

public doD(): void {
console.log('Component 2 does D.');
this.mediator.notify(this, 'D');
}
}

// 使用
const c1 = new Component1();
const c2 = new Component2();
// 绑定组件中的中介者
const mediator = new ConcreteMediator(c1, c2);
// 组件分别触发中介者
console.log('Client triggers operation A.');
c1.doA();

console.log('');
console.log('Client triggers operation D.');
c2.doD();
  • 缺点:中介者可能会演化为上帝对象