여러개의 객체들이 상호의존적인 상황에서 각 객체들간의 결합성을 낮추기 위해 사용하는 패턴이다. 각 객체들이 서로의 상태를 확인하며 동작하는대신, 중재자 역할을 담당하는 하나의 중심 객체를 통해 행동을 지시 받는다.
보통 프론트를 구성할 때 많이 볼 수 있으며, [[MVC 패턴]]의 Controller가 중재자Mediator의 역할을 수행한다.
interface Mediator {
notify(sender: object, event: string): void;
}
class ConcreteMediator implements Mediator {
constructor(
private readonly component1: Component1,
private readonly component2: Component2,
) {
this.component1.setMediator(this);
this.component2.setMediator(this);
}
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 Colleague {
declare protected mediator: Mediator;
setMediator(mediator: Mediator): void {
this.mediator = mediator;
}
}
class Component1 extends Colleague {
doA(): void {
console.log('Component 1 does A.');
this.mediator.notify(this, 'A');
}
doB(): void {
console.log('Component 1 does B.');
this.mediator.notify(this, 'B');
}
}
class Component2 extends Colleague {
doC(): void {
console.log('Component 2 does C.');
this.mediator.notify(this, 'C');
}
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);
// Client triggers A
const handlerA = () => c1.doA();
// Client triggers D
const handlerD = () => c2.doD();
구성원들이 중앙집권적인 어떤 객체를 거쳐서 통신하는 모습이 Pub/Sub과 유사하지만 두 패턴의 목적이 다르다.
Pub/Sub 패턴은 중계에 그 목적이 있다.
한 구성원에게서 받은 메세지를 다른 모든 구성원들에게 어떻게 전달할지를 구현하기 위한 패턴이다.
하지만 넓은 의미에서 Mediator 패턴의 한 부분으로서 Pub/Sub 패턴이 사용될 수는 있다.
Java언어로 배우는 디자인 패턴 입문 - 쉽게 배우는 Gof의 23가지 디자인패턴 (영진닷컴)