[디자인패턴] 중재자 패턴 (Mediator Pattern)

반응형

 

1. 중재자 패턴 정의

💡 중재자 패턴 (Mediator Pattern)
객체 간의 상호 작용을 캡슐화하여 객체 간의 직접적인 통신을 방지하고, 중재자 객체를 통해 간접적으로 상호 작용하도록 하는 디자인 패턴이다.

 

'Mediator'는 '중재자'라는 뜻이다. 그룹의 멤버들이 많아 소통이 원활하지 않을때, '중재자'를 두는 것을 생각하면 된다. 멤버는 모두 중재자에게만 보고하고, 중재자는 멤버에게 지시를 내리도록 하면 '중재자'를 통해 소통이 원활해지게 된다.

 

2. 예제 프로그램

Mediator 패턴을 사용해 나타낸 간단한 채팅 어플리케이션

역할 이름 내용
 Mediator  ChatMediator 인터페이스  중재자 역할을 정의
 Colleague  User 클래스  사용자 역할을 정의
 ConcreteMediator  ChatRoom 클래스  실제 중재자로 중재자 역할 인터페이스를 구현
 ConcreteColleague  ChatUser 클래스  실제 사용자로 사용자 역할 클래스를 확장.
 사용자는 중재자에 등록되어 중재자를 통해 다른 사용자들에게 메시지를 전송하고 수신
 Client  ChatMediatorTest 실행 클래스  동작 테스트용 클래스

 

/** 클라이언트 (테스트 소스로 갈음한다) */
class ChatMediatorTest {
    @Test
    void main2() {
        ChatMediator chatRoom = new ChatRoom();

        ChatUser user1 = new ChatUser("Ari", chatRoom);
        ChatUser user2 = new ChatUser("Bailey", chatRoom);
        ChatUser user3 = new ChatUser("Catalina", chatRoom);
        ChatUser user4 = new ChatUser("Dorothy", chatRoom);

        chatRoom.addUser(user1);
        chatRoom.addUser(user2);
        chatRoom.addUser(user3);
        chatRoom.addUser(user4);

        // 전체 메시지
        user1.sendMessage("Hello, guys~!!");

        // 특정인에게 메시지
        user2.sendDirectMessage("Dorothy, This is DM.", user4);
    }
}

 

실행결과

-------------------------------------------
[Ari] sends message: Hello, guys~!!
-------------------------------------------
[Bailey] receives message: Hello, guys~!!
[Catalina] receives message: Hello, guys~!!
[Dorothy] receives message: Hello, guys~!!
-------------------------------------------
[Bailey] sends a direct message to [Dorothy]: Dorothy, This is DM.
-------------------------------------------
[Dorothy] receives message: Dorothy, This is DM.

 

 

 

3. Mediator 패턴의 클래스 다이어그램

  • Mediator (중재자, 조정자) 
    • 객체간의 상호 작용을 총괄하는 인터페이스 또는 클래스 
    • 다른 객체들 간의 통신을 조정하고 관리 
    • 예제 : ChatMediator 인터페이스
  • Concrete Mediator (구체적인 중재자) 
  • Colleague (동료) 
    • Mediator(중재자)와 통신하는 객체 
    • Colleague 는 서로 직접 통신하지 않고 Mediator(중재자)를 통해 간접적으로 통신 
    • 예제 : User 클래스
  • Concrete Colleague (구체적인 동료) 

 

4. 특징

(1) Colleague 들은 중재자를 통해 간접 통신하므로 느슨하게 결합되며 유연성이 증가한다. 

Colleague 객체들은 Mediator(중재자)를 통해 간접적으로 통신하기 때문에 객체간의 결합도가 낮아지며 객체 간의 상호 작용을 중재자에게 위임한다. 이로 인해 객체들을 독립적으로 변경하거나 추가하기가 유연해진다. 

 

(2) Mediator 가 통신을 관리하므로 중재자에게 집중되어 부담이 커질수도 있다. 

중재자가 전반적인 통신을 담당하므로 부하가 집중될 수 있다. 만약 복잡한 로직을 수행한다면 그 부담은 더 커질수 있다. 

 

(3) 파사드(Facade) 패턴과의 차이 

파사드 패턴과 중재자 패턴은 비슷해 보이지만 약간의 차이가 있다. 

  • 중재자 패턴은 객체 간의 상호 작용을 중앙 집중화하여 관리한다. 
  • 파사드 패턴은 복잡한 서브시스템에 대한 통합된 인터페이스를 제공하여 클라이언트가 편리하게 사용할 수 있도록 한다. 
  • Mediator 는 양방향이지만 Facade 는 단방향이라고 할 수 있다.
반응형