본문 바로가기
IT 개인 공부/디자인패턴

중재자 패턴(Mediator)

by Libi 2021. 7. 29.
반응형

중재자 패턴(Mediator)은 행위(Behavioral) 패턴 중 하나로써 수많은 객체들 간의 복잡한 상호작용을 캡슐화하여 객체로 정의하는 패턴이다.

중재자 의미를 생각하면 쉽다. 객체끼리 서로 직접 통신하지 않고 중재자에게 전달하면 이를 전달해 주는 방식으로 통신하기 때문에 객체 간 의존성을 줄일 수 있으므로 결합도를 감소시킬 수 있다.

중재자 패턴의 구조는 다음과 같다.

  • Mediator : Colleague 객체 간의 통신을 중재자 역할을 통해 관리하는 인터페이스이다. Colleague 객체들은 전달 사항이 생기면 Mediator에게 전달한다.
  • ConcreteMediator : Mediator를 구현한 클래스
  • Colleague : 서로 통신할 객체의 인터페이스, Mediator에게 전달사항을 전달
  • Colleague1, Colleauge2 : 객체를 구현한 클래스, 통신 내용을 Mediator에게 전달받는다.

간단한 예시를 통해 중재자 패턴을 알아보자.

A, B, C라는 사람이 약속을 정하기 위해 통신하는 과정을 생각해 보자.

요즘에야 카카오톡 같은 단체 메신저 시스템이 존재하지만 이런 시스템이 없던 시절에는 하나하나씩 문자메시지를 통해 전달해야 했다.

이런 시스템은 A가 메시지를 공유하기 위해서는 B, C 모두에게 전달해야 하는 번거로움이 존재한다.

하지만 요즘에는 카카오톡 같은 단체 메신저 시스템을 이용하면 한 개의 메시지만 전달하여도 카카오톡 서버가 알아서 채팅방에 속한 사람들에게 전달해 준다.

즉, 카카오톡 채팅방이 중재자 역할을 수행해 주는 것이다. 그렇다면 중재자 패턴을 적용하여 위의 상황을 구현해보자.

먼저 Mediator이다. Colleague들을 관리해 줄 List를 하나 가지며 setColleague() 메서드를 통해 Colleague들을 List에 추가해 준다.

어떻게 중재할 것인지에 대해선 추상 메서드로 구현하여 넘겨준다.

import java.util.ArrayList;
import java.util.List;

public abstract class Mediator {

	protected List<Colleague> colleagues;

	public Mediator() {
		colleagues = new ArrayList<>();
	}

	public void setColleague(Colleague colleague) {
		colleagues.add(colleague);
	}

	public abstract void mediate(String msg);
}

다음으로 중재자 역할인 카카오톡을 구현한 KaKaoTalk이다. meidate() 메서드를 구현하여 Colleague들을 중재해 준다.

public class KaKaoTalk extends Mediator {
	
	@Override
	public void mediate(String msg) {
		for (Colleague colleague : colleagues) {
			colleague.action(msg);
		}
	}
}

다음으로 Colleague이다. Mediator를 하나 가지며 자신을 Mediator에게 등록해 주는 setMediator() 메서드와 메시지를 전달하는 sendMsg() 메서드를 가진다.

중재자가 메시지를 전달할 때 어떻게 반응할 것인지는 추상 메서드로 넘겨준다.

public abstract class Colleague {

	private Mediator mediator;
	
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
		mediator.setColleague(this);
	}
	
	public void sendMsg(String msg) {
		mediator.mediate(msg);
	}
	
	public abstract void action(String msg);
}

마지막으로 카카오톡 채팅방 유저를 구현한 KaKaoTalkColleague이다. action() 메서드를 구현해 준다.

public class KaKaoTalkColleague extends Colleague {

	@Override
	public void action(String msg) {
		System.out.println("Send a [" + msg + "] to " + this);
	}
}

Main 클래스에서 A, B, C 유저를 카카오톡 채팅방에 등록한 후 A가 메시지를 전송하면 중재자인 카카오톡 서버가 B와 C에게 해당 메시지를 전달해 주는 것을 알 수 있다.

public class Main {

	public static void main(String[] args) {
		Mediator kakaoTalk = new KaKaoTalk();
		Colleague colleagueA = new KaKaoTalkColleague();
		Colleague colleagueB = new KaKaoTalkColleague();
		Colleague colleagueC = new KaKaoTalkColleague();

		colleagueA.setMediator(kakaoTalk);
		colleagueB.setMediator(kakaoTalk);
		colleagueC.setMediator(kakaoTalk);
		
		colleagueA.sendMsg("내일 8시에 만나자");
	}
}

 

 

반응형

댓글