|
1 | | -export interface Mediator { |
2 | | - send(msg: string, colleague: Colleague): void |
3 | | -} |
4 | 1 |
|
| 2 | + |
| 3 | +/** |
| 4 | + * 中介者:用于模块之间通信。 |
| 5 | + */ |
| 6 | + |
| 7 | +//抽象中介者 |
| 8 | +abstract class Mediator { |
| 9 | + public abstract register(colleague: Colleague): void; |
| 10 | + public abstract relay(cl: Colleague): void; //转发 |
| 11 | +} |
| 12 | +//具体中介者 |
| 13 | +class ConcreteMediator extends Mediator { |
| 14 | + private colleagues: Array<Colleague> = [] |
| 15 | + public register(colleague: Colleague): void { |
| 16 | + if (this.colleagues.indexOf(colleague) === -1) { |
| 17 | + this.colleagues.push(colleague) |
| 18 | + colleague.setMedium(this) |
| 19 | + } |
| 20 | + } |
| 21 | + public relay(cl: Colleague): void { |
| 22 | + this.colleagues.forEach((colleague: Colleague, index) => { |
| 23 | + if (cl !== colleague) { |
| 24 | + colleague.receive() |
| 25 | + } |
| 26 | + }) |
| 27 | + } |
| 28 | +} |
| 29 | +//抽象同事类 |
5 | 30 | abstract class Colleague { |
6 | | - public mediator: Mediator |
7 | | - constructor(mediator: Mediator) { |
8 | | - this.mediator = mediator |
| 31 | + protected mediator: Mediator; |
| 32 | + public setMedium(mediator: Mediator): void { |
| 33 | + this.mediator = mediator; |
9 | 34 | } |
10 | | - abstract send(msg: string): void |
11 | | - abstract receive(msg: string): void |
| 35 | + public abstract receive(): void; |
| 36 | + public abstract send(): void; |
12 | 37 | } |
13 | | - |
14 | | -class ConcreteColleagueA extends Colleague { |
15 | | - constructor(mediator: Mediator) { |
16 | | - super(mediator) |
| 38 | +//具体同事类 |
| 39 | +class ConcreteColleague1 extends Colleague { |
| 40 | + constructor() { |
| 41 | + super() |
17 | 42 | } |
18 | | - public send(msg: string): void { |
19 | | - this.mediator.send(msg, this) |
| 43 | + public receive(): void { |
| 44 | + console.log("具体同事类1收到请求。"); |
20 | 45 | } |
21 | | - public receive(msg: string): void { |
22 | | - console.log(msg, "`receive` of ConcreteColleagueA is being called!") |
| 46 | + public send(): void { |
| 47 | + console.log("具体同事类1发出请求。"); |
| 48 | + this.mediator.relay(this); //请中介者转发 |
23 | 49 | } |
24 | 50 | } |
25 | | - |
26 | | -class ConcreteColleagueB extends Colleague { |
27 | | - constructor(mediator: Mediator) { |
28 | | - super(mediator) |
| 51 | +//具体同事类 |
| 52 | +class ConcreteColleague2 extends Colleague { |
| 53 | + constructor() { |
| 54 | + super() |
29 | 55 | } |
30 | | - public send(msg: string): void { |
31 | | - this.mediator.send(msg, this) |
| 56 | + public receive(): void { |
| 57 | + console.log("具体同事类2收到请求。"); |
32 | 58 | } |
33 | | - public receive(msg: string): void { |
34 | | - console.log(msg, "`receive` of ConcreteColleagueB is being called!") |
| 59 | + public send(): void { |
| 60 | + console.log("具体同事类2发出请求。"); |
| 61 | + this.mediator.relay(this); //请中介者转发 |
35 | 62 | } |
36 | 63 | } |
37 | | - |
38 | | -class ConcreteMediator implements Mediator { |
39 | | - public concreteColleagueA: ConcreteColleagueA |
40 | | - public concreteColleagueB: ConcreteColleagueB |
41 | | - public send(msg: string, colleague: Colleague): void { |
42 | | - if (this.concreteColleagueA === colleague) { |
43 | | - this.concreteColleagueB.receive(msg) |
44 | | - } else { |
45 | | - this.concreteColleagueA.receive(msg) |
46 | | - } |
| 64 | +//具体同事类 |
| 65 | +class ConcreteColleague3 extends Colleague { |
| 66 | + constructor() { |
| 67 | + super() |
| 68 | + } |
| 69 | + public receive(): void { |
| 70 | + console.log("具体同事类3收到请求。"); |
| 71 | + } |
| 72 | + public send(): void { |
| 73 | + console.log("具体同事类3发出请求。"); |
| 74 | + this.mediator.relay(this); //请中介者转发 |
47 | 75 | } |
48 | 76 | } |
49 | 77 |
|
50 | | - |
51 | | -class Client { |
| 78 | +class ConcreteMediatorClient { |
52 | 79 | public static main(): void { |
53 | | - let cm: ConcreteMediator = new ConcreteMediator(), |
54 | | - c1: ConcreteColleagueA = new ConcreteColleagueA(cm), |
55 | | - c2: ConcreteColleagueB = new ConcreteColleagueB(cm) |
56 | | - cm.concreteColleagueA = c1 |
57 | | - cm.concreteColleagueB = c2 |
58 | | - c1.send("Hello ConcreteColleagueB") |
59 | | - c2.send("Hello ConcreteColleagueA") |
| 80 | + let md: Mediator = new ConcreteMediator(); |
| 81 | + let c1: Colleague = new ConcreteColleague1(); |
| 82 | + let c2: Colleague = new ConcreteColleague2(); |
| 83 | + let c3: Colleague = new ConcreteColleague3(); |
| 84 | + md.register(c1); |
| 85 | + md.register(c2); |
| 86 | + md.register(c3); |
| 87 | + c1.send(); |
| 88 | + c2.send(); |
60 | 89 | } |
61 | 90 | } |
62 | | -Client.main() |
63 | | - |
64 | | -// Hello ConcreteColleagueB `receive` of ConcreteColleagueB is being called! |
65 | | -// Hello ConcreteColleagueA `receive` of ConcreteColleagueA is being called! |
66 | | - |
|
0 commit comments