학습 목표
- 복잡한 관계를 간단한 관계로 구현한다.
- 객체 간 직접적인 의존도를 줄이는 것이 why 중요한지 이해한다
- 미디에이터 패턴이 언제 필요한지 판단할 수 있다
- 실서비스에서 적용할 수 있도록 예제 흐름 + 코드를 이해한다
- 기존 구조와 비교해 장단점을 설명할 수 있다
상황 예제
- 컴포넌트들이 서로 직접 참조하고 메시지를 주고받음
- UI 컴포넌트가 서로 이벤트를 주고받음
- 채팅방 기능 개발
⇒ N:N → N:1 관계로 개선
예제
더보기
유저를 연결해서 다른 유저한테 전체 메시지를 보내는 방법
- Mediator (인터페이스) — 메시지 전달 규약 정의
public interface Mediator {
void send(String message, Colleague colleague);
}
- Colleague (추상 클래스)
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public void send(String message) {
mediator.send(message, this);
}
public abstract void receive(String message);
}
- Concrete Mediator ( 실제 구현 클래스 )
public class ConcreteMediator implements Mediator{
private List<Colleague> colleagues = new ArrayList<>();
public void register(Colleague colleague) {
colleagues.add(colleague);
}
@Override
public void send(String message, Colleague sender) {
for (Colleague c : colleagues) {
if (c != sender) {
c.receive(message);
}
}
}
}
- Concrete Colleague ( 구독 유저 정보 )
public class User extends Colleague {
private String name;
public User(Mediator mediator, String name) {
super(mediator);
this.name = name;
}
@Override
public void receive(String message) {
System.out.println(name + " received: " + message);
}
}
- 실행
public class Main {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
User user1 = new User(mediator, "Alice");
User user2 = new User(mediator, "Bob");
User user3 = new User(mediator, "Charlie");
mediator.register(user1);
mediator.register(user2);
mediator.register(user3);
user1.send("Hello everyone!");
}
}
- 채팅방처럼 하나의 그룹으로 묶어서 메시지를 보내는 로직
마무리
상당히 쓰기 어려운 조건으로 만들어지는 것 같습니다. 그러나 동시에 1:N or N:N을 연결해서 서로 통신을 해야 하는 상황에서 많은 도움이 될 것 같아요.
'Java > 패턴' 카테고리의 다른 글
| 메멘토 패턴 ( Memento Pattern ) (0) | 2025.12.08 |
|---|---|
| 상태 패턴 ( State Pattern ) (0) | 2025.12.05 |
| 옵저버 패턴 ( Observer Pattern ) (0) | 2025.12.03 |
| 파사드 패턴 ( Facade Pattern ) (0) | 2025.12.02 |
| 책임사슬 패턴 ( Chain of Resposibility Pattern) (0) | 2025.12.01 |