중재자 패턴(Mediator Pattern)은 객체 간의 복잡한 통신을 캡슐화하여 객체 간의 상호작용을 중재자 객체가 담당하도록 만드는 행동 패턴이다.
이를 통해 객체들이 직접적으로 상호작용하는 대신 중재자를 통해 통신함으로써 객체 간의 의존성을 줄이고 시스템의 유연성을 높일 수 있다.
객체 지향 프로그래밍에서는 서로 연관된 여러 객체가 직접적으로 통신하면, 객체 간의 의존성이 높아지고 시스템 구조가 복잡해지는 문제가 발생할 수 있다.
이럴 때 중재자 패턴을 사용하면 다음과 같은 이점을 얻을 수 있다:
예를 들어, 채팅 애플리케이션에서 여러 사용자가 채팅방에 참여해 메시지를 주고받는 상황을 생각해보자.
사용자들이 서로 직접 통신하면 복잡성이 증가하지만, 중재자 패턴을 적용해 채팅방 객체를 중재자로 사용하면 이를 간단하게 구현할 수 있다.
Mediator
+
|
ConcreteMediator
+
|
Colleague
+
|
ConcreteColleague
이번 예시에서는 채팅방(Mediator)을 중재자로 사용하여 여러 사용자가 메시지를 주고받는 채팅 애플리케이션을 구현해보겠다.
// Mediator 인터페이스
interface ChatRoom {
void showMessage(String user, String message);
}
// ConcreteMediator 클래스
class ChatRoomImpl implements ChatRoom {
@Override
public void showMessage(String user, String message) {
System.out.println(user + ": " + message);
}
}
// Colleague 추상 클래스
abstract class User {
protected ChatRoom chatRoom;
protected String name;
public User(ChatRoom chatRoom, String name) {
this.chatRoom = chatRoom;
this.name = name;
}
public abstract void sendMessage(String message);
}
// ConcreteColleague 클래스
class ChatUser extends User {
public ChatUser(ChatRoom chatRoom, String name) {
super(chatRoom, name);
}
@Override
public void sendMessage(String message) {
chatRoom.showMessage(name, message);
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoomImpl();
User user1 = new ChatUser(chatRoom, "Alice");
User user2 = new ChatUser(chatRoom, "Bob");
User user3 = new ChatUser(chatRoom, "Charlie");
user1.sendMessage("안녕하세요!");
user2.sendMessage("안녕하세요, Alice!");
user3.sendMessage("모두 반갑습니다.");
}
}
Alice: 안녕하세요!
Bob: 안녕하세요, Alice!
Charlie: 모두 반갑습니다.
중재자 패턴(Mediator Pattern)은 객체 간의 상호작용을 캡슐화하여 복잡성을 줄이고, 유지보수와 확장성을 향상시키는 데 유용한 패턴이다.
특히 많은 객체가 서로 상호작용해야 하는 상황에서 의존성을 효과적으로 줄이는 데 적합하다.
아래 글에서 다른 디자인 패턴들을 확인할 수 있다.
디자인 패턴 모음