본문 바로가기

Design/Design Pattern

[Design Pattern] Mediator Pattern

이번 장에서는 중재자(Mediator) 패턴에 대해서 알아본다.
샘플 코드는 [여기 (링크)] 프로젝트의 테스트 코드로 정리해두었다.


중재자 패턴이란?
위키백과에 따른 정의는 아래와 같다.

객체들의 집합이 상호작용하는지를 함축해놓은 객체를 정의한다.
이 패턴은 프로그램의 실행 행위를 변경할 수 있기 때문에 행위 패턴으로 간주된다.
중재자 패턴을 사용하면 객체 간 통신은 중재자 객체 안에 함축된다. 객체들은 더 이상 다른 객체와 서로 직접 통신하지 않으며
대신 중재자를 통해 통신한다. 이를 통해 객체 간 의존성을 줄일 수 있으므로 결합도를 감소시킨다.

필자는 채팅 어플을 사용하는 사용자들과 채팅 서버(중재자)를 예시로 진행할 예정이다.


GoF Design Patterns에 따르면 아래와 같은 Class Diagram이 그려진다.

Mediator: 중재자의 기능을 명시한 인터페이스
ConcreteMediator: 중재자 구현체
Colleague: 중재자를 통해서 통신하게 될 참여자의 인터페이스
ConcreteColleague1, ConreteColleague2: 중재자를 통해서 통신하게 될 참여자 구현체

위의 그림을 채팅서버와 채팅을 진행하는 사용자에 적용시키면 아래와 같은 Class Diagram이 그려진다.

ChattingUser 인터페이스의 구현체인 ChattingUser들은 서로 직접 통신을 하는 것이 아니라
중재자 구현체인 ChattingServer를 통해서 서로 통신하게 된다.


코드를 보면서 하나씩 살펴보도록 한다.

User Interface
채팅방에 참여하는 참여자들의 구현해야하는 기능을 명시하고 있다.

ChattingUser Class
User 인터페이스를 구현하고 있으며 자신이 속해있는 ChattingServer와 ChattingRoom의 번호를 가지고 있다.

Server Interface
중재자 서버들이 구현해야하는 기능을 명시하고 있다.

ChattingServer Class
Server 인터페이스를 구현하고 있다.
sendMessage 부분이 조금 복잡할 수 있지만 자세히 보면 그렇지 않다.
메시지를 전송한 사용자와 같은 방에 있는 사용자들에게만 메시지를 전송하고 있다.
이때 메시지를 전송하는 자기 자신에게는 메시지를 전송하지 않도록 하고 있다.

Tester Class
중재자(채팅 서버)를 생성한다.
참여자(채팅 사용자)를 생성할 때 채팅방 번호를 부여하고 생성된 참여자들을 채팅 서버에 접속시킨다.

코드를 실행한 결과는 아래와 같다.

1번 사용자가 발생시킨 메시지는 같은 1번 방에 있는 2번 사용자에게만 전달되었다.
3번 사용자가 발생시킨 메시지는 같은 2번 방에 있는 4번 사용자에게만 전달되었다.
여기서 중재자 패턴의 핵심을 다시 한번 짚어보면
1번 사용자가 2번 사용자에게 바로 메시지를 전송한 것이 아니라는 것이다.
또한 1번 사용자가 발생시킨 메시지가 3, 4번 사용자에게 전달되지 않은 것도 1번 사용자의 역할이 아닌 중재자의 역할이라는 점이다.


지금까지 채팅 서버와 채팅 서버에 접속한 사용자를 예로들어 중재자 패턴에 대해서 알아보았다.