# 설명
중재자 패턴(Mediator Pattern)은 N:M의 관계로 객체들의 소통이 이루어 지고 있는 복잡한 관계를 해결할 수 있다. N:M의 관계를 1:N의 관계로 바꾸어 준다.
만일 위 그림에서 관제탑이 없다면 각 비행기들은 서로 소통을 해야하지만, 관제탑(중재자)가 이러한 소통의 창구 역할을 해준다.
파사드 패턴, 옵저버 패턴과 유사함을 느낄 수 있다.
옵저버 패턴은 1:N의 관계였다. 즉, 신문사에서 새로운 기사가 나온다면 구독한 고객들에게 알림을 보내줬다. 그러나 구독자들은 신문사에게 알림을 보내지 않았다. 중재자 패턴은 각자가 알림을 보내기도 하고 받기도 한다고 생각하면 된다.
UI프로그래밍에서 많이 쓰인다. 각 Widget간의 연관관계가 많다. 예를들어 아이디를 입력하지 않았다면 로그인 버튼이 눌리지 않도록 해야한다. 이러한 관계들을 중재자를 만들어 전담하게 함으로써 각 객체간 소통하도록 하지 않는다.
- Mediator : Colleague 객체와 교루하는데 필요한 인터페이스를 정의한다.
- ConcreteMediator : Colleague간의 협력을 구현한다.
- Colleague : Mediator의 참조자를 가지고 있다. 다른 객체와 상호작용이 필요할 경우 notify한다.
즉, Mediator를 사용함으로써 객체간 의존성을 중리고 결합도를 감소시킨다.
# 예제
- 중재자를 통한 채팅방을 구현한다.
- Colleague는 메시지를 보낼 수도 있고 받을 수도 있다.
## Mediator
// Mediator
public abstract class Mediator {
ArrayList<Colleague> list;
Mediator(){
list = new ArrayList<Colleague>();
}
public void addUser(Colleague user){
list.add(user);
}
public abstract void mediate(Colleague user, String msg);
}
## ConcreteMediator
// ChatApp
public class ChatApp extends Mediator{
@Override
public void mediate(Colleague user, String msg) {
for( Colleague u : list){
if ( u != user ) {
u.recived(msg);
}
}
}
}
## Colleague
// Colleague
public interface Colleague {
public void recived(String msg);
public void send(String msg);
}
## Concrete Colleague
// User
public class User implements Colleague{
String name;
Mediator mediator;
User(String name, Mediator mediator){
this.name = name;
this.mediator = mediator;
}
@Override
public void recived(String msg) {
System.out.println(name + "님에게 메시지 도착 - " + msg);
}
@Override
public void send(String msg) {
System.out.println("@@@@" + name + "-> ALL : " + msg+ "@@@@@");
mediator.mediate(this,msg);
}
}
# 테스트
public class Test {
public static void main(String[] args) {
Mediator kakaoTalk = new ChatApp();
Colleague hojun = new User("hojun",kakaoTalk);
Colleague james = new User("james",kakaoTalk);
Colleague tom = new User("tom",kakaoTalk);
kakaoTalk.addUser(hojun);
kakaoTalk.addUser(james);
kakaoTalk.addUser(tom);
hojun.send("내일 밥 뭐 먹을래? ");
james.send("치김볶 ㄱㄱ");
tom.send("난 낼 다이어트할거야 밥 안먹을래");
}
}
'• 독서 > Design Pattern' 카테고리의 다른 글
[클린소프트웨어#2] 익스트림프로그래밍(XP)에 대해서 (0) | 2022.10.18 |
---|---|
[클린소프트웨어#1] 애자일(Agile) 방법론과 4가지 가치와 12개의 원칙 (0) | 2022.10.18 |
[디자인패턴] 퍼사드 패턴(Facade Pattern) (0) | 2022.10.11 |
[디자인 패턴] 메멘토 패턴(Memento Pattern) (0) | 2022.10.10 |
[디자인 패턴] 옵저버 패턴(Observer Pattern) (1) | 2022.10.04 |