중재자 패턴은 개체들이 직접 통신하지 않고 중재자 개체를 통해 통신하도록하는 디자인패턴이다. 개체간의 상호작용을 캡슐화 하여 개체간의 결합도를 줄이고, 개체간의 상호작용을 한 곳에서 관리할 수 있도록 한다.
주요 개념 부터 살펴보자
1. Mediator (중재자) : 개체 간의 상호 작용을 조정하는 인터페이스를 정의한다.
2. ConcreteMediator (구체적인 중재자) : Mediator 인터페이스를 구현하며, 개체간의 상호작용을 실제로 조정한다.
3. Colleague (동료개체) : 상호작용하는 개체들로, 중재자와 상호작용한다.
4. ConcreteColleague (구체적인 동료 개체) : Colleague 인터페이스를 구현하며, 중재자를 통해 다른 개체들과 통신한다.
중재자 패턴이 가장 많이 쓰이는 채팅 시스템 소스코드를 살펴보자.
// Mediator 인터페이스: 객체 간의 상호작용을 조정하는 메서드를 정의
interface ChatMediator {
void sendMessage(String message, User user);
void addUser(User user);
}
import java.util.ArrayList;
import java.util.List;
// ConcreteMediator 클래스: Mediator 인터페이스를 구현하며, 객체 간의 상호작용을 조정
class ChatMediatorImpl implements ChatMediator {
private List<User> users;
public ChatMediatorImpl() {
this.users = new ArrayList<>();
}
@Override
public void addUser(User user) {
this.users.add(user);
}
@Override
public void sendMessage(String message, User user) {
for (User u : this.users) {
// 메시지를 보낸 사용자가 아닌 다른 사용자에게 메시지를 전달
if (u != user) {
u.receive(message);
}
}
}
}
// Colleague 클래스: Mediator와 상호작용하는 기본 클래스
abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void send(String message);
public abstract void receive(String message);
}
// ConcreteColleague 클래스: Colleague 클래스의 구체적인 구현
class UserImpl extends User {
public UserImpl(ChatMediator mediator, String name) {
super(mediator, name);
}
@Override
public void send(String message) {
System.out.println(this.name + " sends: " + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(this.name + " receives: " + message);
}
}
// Client 클래스: 중재자와 동료 객체들을 설정하고, 메시지를 주고받음
public class MediatorPatternDemo {
public static void main(String[] args) {
ChatMediator mediator = new ChatMediatorImpl();
User user1 = new UserImpl(mediator, "Alice");
User user2 = new UserImpl(mediator, "Bob");
User user3 = new UserImpl(mediator, "Charlie");
User user4 = new UserImpl(mediator, "Dave");
mediator.addUser(user1);
mediator.addUser(user2);
mediator.addUser(user3);
mediator.addUser(user4);
user1.send("Hello, everyone!");
}
}
//출력
//Alice sends: Hello, everyone!
//Bob receives: Hello, everyone!
//Charlie receives: Hello, everyone!
//Dave receives: Hello, everyone!
소스코드와 같이 중재자 패턴을 이용하여 채팅이나 모듈간 상호작용이 필요한 부분을 구현할 수 있다.
이렇게 중재자 패턴을 사용하게되면 상호작용을 한곳에서 관리할 수 있어 유지보수와 확장성에 유리하며, 복잡한 시스템에서 개체간의 결합도를 줄이고 각 개체가 독립적으로 동작할 수 있어 유연성을 높일 수 있다.
'Design Pattern > 행동 패턴(Behavioral Patterns)' 카테고리의 다른 글
옵저버(Observer) - 행동 패턴(Behavioral Patterns) (0) | 2024.05.25 |
---|---|
메멘토(Memento) - 행동 패턴(Behavioral Patterns) (0) | 2024.05.25 |
반복자(Iterator) - 행동 패턴(Behavioral Patterns) (0) | 2024.05.25 |
인터프리터(Interpreter) - 행동 패턴(Behavioral Patterns) (0) | 2024.05.25 |
커맨드(Command) - 행동 패턴(Behavioral Patterns) (0) | 2024.05.25 |