중재자 디자인 패턴은 행동 디자인 패턴 중 하나로, 객체들의 동작에 관련됩니다. 중재자 디자인 패턴은 시스템 내에서 서로 다른 객체들 간에 중앙 통신 매체를 제공하기 위해 사용됩니다.
중재자 디자인 패턴
서로 다른 객체 집합이 상호 작용하고 통신하는 방식을 캡슐화하여 느슨한 결합을 가능하게 합니다. 각 객체 집합의 동작을 서로 독립적으로 변화할 수 있도록 합니다.
중재자 디자인 패턴은 여러 객체가 서로 상호 작용하는 기업 애플리케이션에서 매우 유용합니다. 객체들이 직접적으로 상호 작용하는 경우 시스템 구성 요소들이 서로 강하게 결합되어 유지 보수 비용이 높아지고 확장하기 어려워집니다. 중재자 패턴은 객체들 간의 통신을 위해 중재자를 제공하고 느슨한 결합을 구현하는 데 도움을 줍니다. 항공교통통제는 중재자 패턴의 좋은 예입니다. 여기서 공항 통제실은 서로 다른 항공편 간의 통신을 중재하는 역할을 합니다. 중재자는 객체들 간의 라우터 역할을 하며 통신 방식을 제공하는 자체 로직을 가질 수 있습니다. 서로 통신하는 시스템 객체들은 동료들이라고 부릅니다. 보통 통신을 위한 인터페이스나 추상 클래스를 정의하고 그에 대한 구체적인 중재자 구현체를 생성합니다. 이 예제에서는 사용자들이 그룹 채팅을 할 수 있는 채팅 애플리케이션을 구현해 보겠습니다. 각 사용자는 이름으로 식별되며 메시지를 보내고 받을 수 있습니다. 어떤 사용자가 보낸 메시지는 그룹의 다른 모든 사용자에게 수신되어야 합니다.
중재자 패턴 인터페이스
먼저 중재자 인터페이스를 생성하여 구체적인 중재자들의 계약을 정의할 것입니다. ChatMediator.java
package com.journaldev.design.mediator;
public interface ChatMediator {
public void sendMessage(String msg, User user);
void addUser(User user);
}
중재자 패턴 동료 인터페이스
사용자는 메시지를 보내고 받을 수 있으므로 사용자 인터페이스나 추상 클래스가 있을 수 있습니다. 나는 다음과 같이 사용자를 추상 클래스로 만들고 있습니다. User.java
package com.journaldev.design.mediator;
public abstract class User {
protected ChatMediator mediator;
protected String name;
public User(ChatMediator med, String name){
this.mediator=med;
this.name=name;
}
public abstract void send(String msg);
public abstract void receive(String msg);
}
사용자가 중재자 객체에 대한 참조를 가지고 있음에 유의하십시오. 이것은 다른 사용자 간의 통신에 필요합니다.
구체적인 중재자
이제 우리는 구체적인 중재자 클래스를 만들 것입니다. 이 클래스에는 그룹 내의 사용자 목록이 있으며 사용자 간의 통신에 대한 논리를 제공합니다. ChatMediatorImpl.java
package com.journaldev.design.mediator;
import java.util.ArrayList;
import java.util.List;
public class ChatMediatorImpl implements ChatMediator {
private List users;
public ChatMediatorImpl(){
this.users=new ArrayList<>();
}
@Override
public void addUser(User user){
this.users.add(user);
}
@Override
public void sendMessage(String msg, User user) {
for(User u : this.users){
//메시지는 보낸 사용자에게 수신되지 않아야 합니다
if(u != user){
u.receive(msg);
}
}
}
}
중재자 디자인 패턴 구체적인 동료
이제 클라이언트 시스템에서 사용할 구체적인 사용자 클래스를 만들 수 있습니다. UserImpl.java
package com.journaldev.design.mediator;
public class UserImpl extends User {
public UserImpl(ChatMediator med, String name) {
super(med, name);
}
@Override
public void send(String msg){
System.out.println(this.name+": Sending Message="+msg);
mediator.sendMessage(msg, this);
}
@Override
public void receive(String msg) {
System.out.println(this.name+": Received Message:"+msg);
}
}
send() 메서드가 중재자를 사용하여 사용자에게 메시지를 보내고 중재자가 어떻게 처리될지 알지 못한다는 점에 유의하십시오.
중재자 패턴 예제 클라이언트 프로그램 코드
우리의 채팅 애플리케이션을 간단한 프로그램으로 테스트해 보겠습니다. 여기서 중재자를 생성하고 그룹에 사용자를 추가하고 사용자 중 한 명이 메시지를 보내게 됩니다. ChatClient.java
package com.journaldev.design.mediator;
public class ChatClient {
public static void main(String[] args) {
ChatMediator mediator = new ChatMediatorImpl();
User user1 = new UserImpl(mediator, "Pankaj");
User user2 = new UserImpl(mediator, "Lisa");
User user3 = new UserImpl(mediator, "Saurabh");
User user4 = new UserImpl(mediator, "David");
mediator.addUser(user1);
mediator.addUser(user2);
mediator.addUser(user3);
mediator.addUser(user4);
user1.send("Hi All");
}
}
클라이언트 프로그램이 매우 간단하며 메시지가 어떻게 처리되는지 또는 중재자가 사용자를 받는지 여부를 알지 못합니다. 중재자 패턴 예제 프로그램의 출력은 다음과 같습니다:
Pankaj: Sending Message=Hi All
Lisa: Received Message:Hi All
Saurabh: Received Message:Hi All
David: Received Message:Hi All
중재자 패턴 클래스 다이어그램
JDK에서의 중재자 패턴 예제
- java.util.Timer 클래스 scheduleXXX() 메서드
- Java Concurrency Executor execute() 메서드
- java.lang.reflect.Method invoke() 메서드.
중재자 디자인 패턴 중요한 점
- 중재자 패턴은 객체간의 통신 로직이 복잡할 때 유용하며, 통신 로직을 처리하는 중앙 통신 지점을 가질 수 있습니다.
- 자바 메시지 서비스(JMS)는 관찰자 패턴과 함께 중재자 패턴을 사용하여 응용 프로그램이 다른 응용 프로그램에 데이터를 구독하고 게시할 수 있게 합니다.
- 중재자 패턴을 단순히 느슨한 결합을 달성하기 위해 사용해서는 안 됩니다. 왜냐하면 중재자의 수가 늘어날수록 유지 관리가 어려워지기 때문입니다.
이것이 중재자 디자인 패턴과 그것의 자바 구현에 관한 모든 내용입니다.
Source:
https://www.digitalocean.com/community/tutorials/mediator-design-pattern-java