객체 지향 설계에서 객체의 수가 너무 많아지면 구조가 복잡해져서 객체지향에서 가장 중요한 느슨한 결합의 특성을 해칠 수 있기 때문에 이를 해결하는 방법으로 서로 간 통신을 위해 중간에 이를 통제하고 지시할 수 있는 역할을 하는 중재자를 두고, 중재자에게 모든 것을 요구하여 통신의 빈도수를 줄여 상호 작용의 유연한 변경을 지원하고 객체 지향의 목표를 달성하게 해주는 패턴이다.
즉, 커뮤니케이션을 하고자 하는 객체가 있을 때 서로가 커뮤니케이션 하기 복잡한 경우 M:N의 관계에서 M:1의 관계로 복잡도를 떨어뜨려 이를 해결해주고 서로간 의사소통을 쉽게 해주고 커플링을 약화 시키며, 유지 보수 및 재사용의 확장성에 유리한 패턴이다.
- Mediator: Colleague 객체 간의 상호참조를 위한 인터페이스. 클라이언트 등록, 실행 등의 메소드 정의
- Colleague: 다른 Colleague와의 상호참조를 위한 인터페이스.
- ConcreteMediator: Mediator 구현 클래스. Colleague 간의 상호참조를 조정
- ConcreteColleage: Colleague 구현 클래스. Mediator를 통해 다른 Colleague와의 상호참조
// Mediator.java (Mediator)
public interface Mediator {
void addUser(User user);
void removeUser(User user);
void sendMessage(User user, String message);
}
// UserMessageMediator.java (ConcreteMediator)
public class UserMessageMediator implements Mediator {
private List<User> userList = new ArrayList<>();
@Override
public void addUser(User user) {
userList.add(user);
}
@Override
public void removeUser(User user) {
userList.remove(user);
}
@Override
public void sendMessage(User user, String message) {
for (User u : userList) {
if (u != user) {
u.receive(message);
}
}
}
}
// User.java (Colleague)
public abstract class User {
protected Mediator mediator;
protected String name;
public User(Mediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void receive(String message);
public abstract void send(String message);
}
// ManUser.java (ConcreteColleague)
public class ManUser extends User {
public ManUser(Mediator mediator, String name) {
super(mediator, name);
}
@Override
public void receive(String message) {
System.out.println("[" + super.name + "] Message arrived: " + message);
}
@Override
public void send(String message) {
System.out.println("[" + super.name + "] Sent message");
super.mediator.sendMessage(this, message);
}
}
// WomanUser.java (ConcreteColleague)
public class WomanUser extends User {
public WomanUser(Mediator mediator, String name) {
super(mediator, name);
}
@Override
public void receive(String message) {
System.out.println("[" + super.name + "] Message arrived: " + message);
}
@Override
public void send(String message) {
System.out.println("[" + super.name + "] Sent message");
super.mediator.sendMessage(this, message);
}
}
// Client.java (Client)
public class Client {
public static void main(String[] args) {
Mediator mediator = new UserMessageMediator();
User user1 = new ManUser(mediator, "Sonny");
User user2 = new ManUser(mediator, "Jimin");
User user3 = new WomanUser(mediator, "Minji");
User user4 = new WomanUser(mediator, "Jenny");
mediator.addUser(user1);
mediator.addUser(user2);
mediator.addUser(user3);
mediator.addUser(user4);
user1.send("어 나 프리미어리그 득점왕 손흥민인데");
mediator.removeUser(user2);
user3.send("어 나 뉴진스 민진데");
}
}
// 실행 결과
[Sonny] Sent message
[Jimin] Message arrived: 어 나 프리미어리그 득점왕 손흥민인데
[Minji] Message arrived: 어 나 프리미어리그 득점왕 손흥민인데
[Jenny] Message arrived: 어 나 프리미어리그 득점왕 손흥민인데
[Minji] Sent message
[Sonny] Message arrived: 어 나 뉴진스 민진데
[Jenny] Message arrived: 어 나 뉴진스 민진데
[디자인패턴] 디자인패턴이란? - 생성패턴, 구조패턴, 행위패턴