[Behavioral Pattern] 중재자 패턴 (Mediator Pattern)
Design Pattern / Behavioral Pattern
중재자 패턴의 정의와 해당 디자인 패턴의 예제 코드를 통한 이해 및 설명 정리
개념
여러 객체 간의 의사소통하는 방법을 추상화
객체 간의 혼란스러운 종속성을 줄일 수 있는 디자인 패턴
객체 간, 직접적인 통신을 제한하고 중재자 객체(Mediator Object)를 통해서만 협업하도록 제한
실생활의 예제
주민들 간의 갈등을 중간에서 해결해주는 아파트 관리사무소
비행기 이착륙을 돕는 관제탑
패턴 구조
해당 형태의 다이어그램 만이 중재자 패턴인 것이 아닌, 해당 형태의 다이어그램이 대표적인 중재자 패턴인 것
- 즉, 다른 다이어그램으로 그려져도 중재자 패턴을 사용한 것일 수 있음
Colleague
간의 직접적인 참조 선이 없는 것이 중요 포인트Mediator
를 참조하고,ConcreteMediator
가 각ColleagueA
,ColleagueB
를 참조
의존성을 중재자인
Mediator
로 몰아 놓음
예제 코드
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
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");
}
}
/** Client Code */
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();
참고한 출처 사이트
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.