Skip to content

Commit c2a5601

Browse files
authored
Update common.ts
1 parent 7d6c277 commit c2a5601

File tree

1 file changed

+72
-48
lines changed

1 file changed

+72
-48
lines changed

src/Mediator(中介者)/common.ts

Lines changed: 72 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,90 @@
1-
export interface Mediator {
2-
send(msg: string, colleague: Colleague): void
3-
}
41

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+
//抽象同事类
530
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;
934
}
10-
abstract send(msg: string): void
11-
abstract receive(msg: string): void
35+
public abstract receive(): void;
36+
public abstract send(): void;
1237
}
13-
14-
class ConcreteColleagueA extends Colleague {
15-
constructor(mediator: Mediator) {
16-
super(mediator)
38+
//具体同事类
39+
class ConcreteColleague1 extends Colleague {
40+
constructor() {
41+
super()
1742
}
18-
public send(msg: string): void {
19-
this.mediator.send(msg, this)
43+
public receive(): void {
44+
console.log("具体同事类1收到请求。");
2045
}
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); //请中介者转发
2349
}
2450
}
25-
26-
class ConcreteColleagueB extends Colleague {
27-
constructor(mediator: Mediator) {
28-
super(mediator)
51+
//具体同事类
52+
class ConcreteColleague2 extends Colleague {
53+
constructor() {
54+
super()
2955
}
30-
public send(msg: string): void {
31-
this.mediator.send(msg, this)
56+
public receive(): void {
57+
console.log("具体同事类2收到请求。");
3258
}
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); //请中介者转发
3562
}
3663
}
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); //请中介者转发
4775
}
4876
}
4977

50-
51-
class Client {
78+
class ConcreteMediatorClient {
5279
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();
6089
}
6190
}
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

Comments
 (0)