중재자 mediator 패턴 - 타입스크립트 예제
요약
중재자 mediator 패턴을 타입스크립트 코드와 함께 알아봅니다.
중재자 패턴 요약
패턴 종류 | 핵심 키워드 |
---|---|
중재자 (Mediator) | 객체 간의 통신, 제어를 중앙에서 관리, 객체지향 목표 달성하게 해줌,통신 빈도수 낮음 |

중재자 (Mediator) 패턴
중재자 패턴은 수많은 객체(Colleague)들 간의 복잡한 상호작용과 의존성을 하나의 중재자(Mediator) 객체에 캡슐화하여, 객체들이 서로 직접 통신하지 않고 오직 중재자를 통해서만 소통하도록 만드는 패턴입니다.
가장 대표적인 비유는 '항공 관제탑' 입니다. 공항에는 수많은 비행기들이 이착륙합니다. 만약 모든 비행기가 다른 모든 비행기와 직접 통신하여 착륙 순서나 항로를 조율한다면 엄청난 혼란이 발생할 것입니다. 대신, 모든 비행기(Colleague)는 오직 관제탑(Mediator)하고만 통신합니다. 관제탑은 모든 비행기의 상태를 파악하고, 각 비행기에게 언제, 어디로 가야 할지 지시하며 모든 상호작용을 중앙에서 통제합니다.
이처럼 중재자 패턴은 객체 간의 직접적인 연결(M:N 관계)을 중재자를 통한 간접적인 연결(M:1 관계)로 바꿔주어, 시스템의 결합도를 극적으로 낮춥니다.
기본 구조
- Mediator: 동료(Colleague) 객체 간의 통신을 위한 인터페이스를 정의합니다.
- ConcreteMediator:
Mediator
인터페이스를 구현하며, 실제로 동료 객체들을 조정하는 역할을 합니다. 각 동료 객체를 알고 있으며, 그들 간의 통신을 중재합니다. - Colleague: 중재자를 통해 다른 동료와 통신하는 객체들의 공통 인터페이스입니다.
- ConcreteColleague:
Colleague
인터페이스를 구현한 구체적인 클래스입니다. 다른 동료와 통신이 필요할 때, 직접 호출하는 대신 자신의Mediator
에게 요청을 보냅니다.
예시: 채팅방 만들기
여러 명의 사용자가 참여하는 채팅방을 만들어 보겠습니다. 각 사용자(Colleague)는 다른 사용자를 몰라도, 채팅방(Mediator)을 통해 메시지를 보내면 채팅방이 모든 사용자에게 메시지를 전달해 줍니다.
// Colleague
class User {
constructor(public name: string, private chatRoom: ChatRoom) {}
send(message: string): void {
this.chatRoom.showMessage(this, message);
}
}
// Mediator
class ChatRoom {
showMessage(user: User, message: string): void {
const time = new Date().toLocaleTimeString();
const sender = user.name;
console.log(`${time} [${sender}]: ${message}`);
}
}
// 클라이언트 코드
const chatRoom = new ChatRoom();
const user1 = new User("김재현", chatRoom);
const user2 = new User("이영희", chatRoom);
user1.send("안녕하세요, 영희 씨!");
// 출력: 10:30:15 PM [김재현]: 안녕하세요, 영희 씨!
user2.send("네, 안녕하세요! 재현 씨.");
// 출력: 10:30:18 PM [이영희]: 네, 안녕하세요! 재현 씨.
위 예시는 가장 기본적인 형태입니다. 실제로는 ChatRoom
이 User
목록을 가지고 있으면서, 한 User
가 send
를 호출하면 ChatRoom
이 다른 모든 User
에게 메시지를 전달하는 방식으로 구현되어야 합니다.
User
객체는 다른 User
객체의 존재를 전혀 알 필요가 없습니다. 오직 ChatRoom
이라는 중재자만 알고 있으면 됩니다. 만약 새로운 사용자가 추가되거나 채팅방의 규칙(예: 욕설 필터링)이 바뀌어도 User
클래스는 전혀 수정할 필요가 없습니다. 모든 로직은 ChatRoom
에 집중되어 있기 때문입니다.
중재자 패턴 중요 키워드
- 객체 간의 복잡한 통신을 중앙에서 관리합니다.
- 🕸️ M:N의 복잡한 의존 관계를 M:1 관계로 단순화하여 결합도를 낮춥니다.
- 동료(Colleague) 객체는 재사용하기 쉬워지고, 중재자(Mediator)의 로직만 바꾸면 전체 시스템의 행동을 쉽게 변경할 수 있습니다.
- 모든 로직이 중재자에 집중되어, 중재자 자체가 너무 복잡해지는 단점이 있을 수 있습니다.
기출 | |
문제 | 객체 간의 복잡한 통신을 중앙에서 관리하는 패턴으로, 객체지향 목표 달성하게 해주는 디자인 패턴을 보기에서 고르시오 |
보기 | |
답변 | |
정답 | 정답 보기 |