미디에이터 패턴은 여러 객체들 간의 복잡한 상호작용을 한 곳에서 관리해 객체 간 결합도를 낮추는 디자인 패턴이에요. 쉽게말해 각 개체들이 서로 직접 대화하지 않고, 미디에이터를 통해 간접적으로 소통하게 만드는 방법이에요. 만약 n명의 사람이 함께 협업을 하고 서로 상호작용을 하면 n*(n-1)/2 개의 통신선이 필요해요.(n개의 간선 사이의 선분 긋는 경우의수) 하지만 1개의 중재자(Mediator)를 통해서 대화한다면 각 사람은 메디에이터만 바라보고 일을할 수 있다는 장점이 생기는 것과 같아요.
간단히 말하면 UI 컴포넌트 간 연동이나, 채팅방의 사용자들처럼 "모두가 서로에게 메세지를 보내는 구조"를 단순하게 만들 때 사용돼요.

미디에이터 패턴은 중재자 역할을 수행하는 Mediator, 구체적인 중재 로직을 담당하는 ConcreteMediator, 서로 대화하지만 서로를 모르고 Mediator에만 의존하는 Colleague, 그리고 그들이 수행하는 동작들로 구성돼요.
Mediator
역할: Colleague 객체들 사이의 소통 규칙을 정의하는 인터페이스(혹은 추상 클래스)에요. 어떤 객체가 메시지를 보내면 Mediator가 그 메시지를 받아 적절한 대상에게 전달해요.
특징: Colleague 객체들이 직접 참조하지 않도록 만들어 주는 인터페이스 에요.
예시: 비행기 교통 관제 시스템이에요. 비행기들 끼리 직접 통신하기 보다 교통 관제 시스템에서 비행기에 내용을 전달해요.
Colleague
역할: 실제 동작을 수행하는 객체들로 Colleague는 Mediator를 통해 다른 Colleague와 상호작용 해요.
특징: Colleague를 구현한 객체는 서로 직접 알지 않고, Mediator 인터페이스에 의존해서 결합도가 낮고 독립성이 높아요.
예시: 비행기 교통 관제 시스템을 따르는 비행기들이에요.
ConcreteMediator
역할: Mediator 인터페이스를 실제로 구현하는 클래스에요. 상황에 따라 누가 확인해야 하는지 로직을 구현해요.
특징: 중앙 집중형 제어로 복잡한 의사소통 흐름을 단순하게 만들 수 있어요. 물론 부작용으로 Mediator 구현이 복잡해져요.
채팅방에서 사용자가 보낸 메시지를 다른 사용자에게 전달하는 구조를 Mediator 패턴으로 구현해볼게요.
Mediator (채팅방) | Colleague (사용자) |
|---|---|
| |
Client | |
각 user는 사용자가 어떻게 있는지 모르지만, chatRoom이 알아서 채팅을 보내줘요. | |
이제 미디에이터 패턴의 장단점에 대해 알아볼게요.
장점
객체 간의 결합도를 낮춰요.
복잡한 상호작용을 Mediator를 통해서만 처리해요.
Colleague 객체를 독립적으로 확장 및 교체할 수 있어 유지보수성이 좋아저요.
이벤트 흐름을 한 곳에서 파악할 수 있어요.
단점
Mediator가 너무 많은 로직을 가지면 거대한 Object로 탄생할 수 있어요.
너무 많은 책임을 가질 확률이 커요.
이번에는 메디에이터 패턴에 대해 알아봤어요. 아마 옵저버 패턴과 비슷하다고 느낄 수도 있어요. 하지만 매우 달라요.
Mediator는 중재자가 중심이 되어 누구에게 무엇을 보낼지 다 중재자가 통제하고, 객체간의 복잡한 상호작용들을 단순화 하는 목적이 커요. 하지만 Observer는 Subject의 상태 변화에 따라 모든 Observer에게 알려주고, 어떤 상태 변화에 따른 행위를 유발하는 것을 단순화 하는 목적이 커요. 그래서 Subject가 무언가를 통제하지는 목적을 가지지는 않아요.
그리고 Facade 패턴과도 비슷해보일 수 있겠네요. 하지만 이것도 목적이 달라요. Facade 패턴은 복잡한 하위 시스템을 단일 API로 감싸기 위한 것이에요. 하지만 Mediator 패턴은 객체들끼리의 대화를 중재하는 거죠. 그리고 Facade는 패턴 분류를 하면 구조 패턴으로 복잡한 서브시스템을 하나의 단순한 인터페이스로 묶어 구조화하는 것이고 Mediator 패턴은 객첻을 간의 상호작용을 중앙에서 중재하고 제어하는 행위 패턴이에요.
이처럼 단순하지만 헷갈릴 수 있는 패턴이 메디에이터 패턴이에요. 그렇지만 이 패턴을 사용하면 무수히 많이 만들어질 객체간 관계를 1개로 만들 수 있는 강력한 패턴이랍니다.