Java의 중재자 디자인 패턴


중재자 디자인 패턴은 행위 디자인 패턴 중 하나로 객체의 행위를 다룬다. 중재자 디자인 패턴은 시스템의 서로 다른 개체 간에 중앙 집중식 통신 매체를 제공하는 데 사용됩니다.

중재자 디자인 패턴

서로 다른 개체 집합이 서로 상호 작용하고 통신하는 방식을 캡슐화하여 느슨한 결합을 허용합니다. 각 개체 세트의 작업이 서로 독립적으로 변경되도록 허용합니다.

중재자 디자인 패턴은 여러 개체가 서로 상호 작용하는 엔터프라이즈 응용 프로그램에서 매우 유용합니다. 개체가 서로 직접 상호 작용하는 경우 시스템 구성 요소는 서로 밀접하게 결합되어 유지 관리 비용이 높아지고 확장이 어렵지 않습니다. 중재자 패턴은 통신을 위해 개체 간 중재자를 제공하고 개체 간 연결 해제를 구현하는 데 도움이 되는 데 중점을 둡니다. 항공 교통 관제사는 공항 관제실이 서로 다른 항공편 간의 통신을 위한 중재자 역할을 하는 중재자 패턴의 좋은 예입니다. 중재자는 개체 간의 라우터 역할을 하며 통신 방법을 제공하는 자체 논리를 가질 수 있습니다. 서로 통신하는 시스템 개체를 동료라고 합니다. 일반적으로 우리는 통신 계약을 제공하는 인터페이스 또는 추상 클래스를 가지고 있으며 중재자의 구체적인 구현을 가지고 있습니다. 예를 들어 사용자가 그룹 채팅을 할 수 있는 채팅 애플리케이션을 구현하려고 합니다. 모든 사용자는 이름으로 식별되며 메시지를 보내고 받을 수 있습니다. 사용자가 보낸 메시지는 그룹의 다른 모든 사용자가 받아야 합니다.

중재자 패턴 인터페이스

먼저 구체적인 중재자를 위한 계약을 정의할 중재자 인터페이스를 생성합니다. ChatMediator.java

package com.journaldev.design.mediator;

public interface ChatMediator {

	public void sendMessage(String msg, User user);

	void addUser(User user);
}

중재자 패턴 동료 인터페이스

사용자는 메시지를 보내고 받을 수 있으므로 사용자 인터페이스 또는 추상 클래스를 가질 수 있습니다. 아래와 같이 추상 클래스로 User를 생성하고 있습니다. 사용자.자바

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<User> 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){
			//message should not be received by the user sending it
			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(Java Message Service)는 관찰자 패턴과 함께 중재자 패턴을 사용하여 응용 프로그램이 다른 응용 프로그램에 데이터를 구독하고 게시할 수 있도록 합니다.
  • 매개자 수가 늘어나면 유지하기가 어려워지기 때문에 루즈 커플링을 달성하기 위해 중재자 패턴을 사용해서는 안 됩니다.

이것이 중재자 디자인 패턴의 전부이며 Java에서 구현됩니다.