Overview

GOF의 정의에 따르면 mediator 패턴은 완전히 다른 객체 간의 통신이 매우 복잡한 경우 mediator를 통해 객체 간의 통신을 캡슐화하는 방법입니다.
다소 복잡하게 들릴 수 있지만 간단히 말해서 두 객체는 ​​직접 연결되어 있는 것이 아니라 세 번째 객체를 통해 느슨하게 연결되어 있습니다.

예를 들어 워드 프로세스 프로그램을 선택할 수 있습니다. 텍스트에 영향을 주는 여러 패널이 있습니다.
서식 패널은 텍스트의 텍스트를 수정하고 그림 패널은 텍스트에 그림을 삽입합니다.
두 패널은 다르지만 하나의 문서에 영향을 줄 수 있습니다.
이 경우 패턴은 한 패널에서 이벤트가 발생하면 문서를 변경하고 다른 패널을 돕는 패턴입니다.

장점:
효율적인 리소스 관리(리소스 풀 등)가 가능합니다.
객체 간의 통신을 위해 서로 직접 참조할 필요가 없습니다.
중재자 구현 클래스는 나중에 더 효율적인 클래스로 변경할 수 있습니다.

불리:
객체 간의 통신 로직이 복잡해지거나 객체의 형태가 자주 바뀌면 유지 및 관리가 어렵습니다.

 

Structure

https://always-intern.tistory.com/5

 

Code Example

package com.example.design.pattern;

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

interface IDestination {
	public void receiveEvent(String from, String event);
}

class Display implements IDestination {
	@Override
	public void receiveEvent(String from, String event) {
		System.out.println("Display : from " + from + " event : " + event);
	}
}

class Log implements IDestination {
	@Override
	public void receiveEvent(String from, String event) {
		System.out.println("Log : from " + from + " event : " + event);
	}
}

/////////////////////////////////////////////////////////////////////////
interface ISource {
	public void setMediator(Mediator mediator);

	public void eventOccured(String event);
}

class TcpComm implements ISource {
	Mediator mediator;

	@Override
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}

	@Override
	public void eventOccured(String event) {
		System.out.println("TcpComm event Occured");
		mediator.onEvent("TCP comm", event);
	}
}

class SystemSignal implements ISource {
	Mediator mediator;

	@Override
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}

	@Override
	public void eventOccured(String event) {
		System.out.println("SystemSignal event Occured");
		mediator.onEvent("System", event);
	}
}

class Mediator {
	List<IDestination> list = new ArrayList<IDestination>();

	public void addDestination(IDestination destination) {
		list.add(destination);
	}

	public void onEvent(String from, String event) {
		for (IDestination each : list) {
			each.receiveEvent(from, event);
		}
	}
}

public class MyMediator {
	public static void main(String[] args) {
		Mediator mediator = new Mediator();
		
		ISource tcp = new TcpComm();
		tcp.setMediator(mediator);
		
		ISource system = new SystemSignal();
		system.setMediator(mediator);
		
		mediator.addDestination(new Display());
		mediator.addDestination(new Log());
		
		tcp.eventOccured("connected");
		tcp.eventOccured("disconnected");
		
		system.eventOccured("key input");
		system.eventOccured("mouse input");

	}
}

 

Console Result

TcpComm event Occured
Display : from TCP comm event : connected
Log : from TCP comm event : connected
TcpComm event Occured
Display : from TCP comm event : disconnected
Log : from TCP comm event : disconnected
SystemSignal event Occured
Display : from System event : key input
Log : from System event : key input
SystemSignal event Occured
Display : from System event : mouse input
Log : from System event : mouse input

 

Conclusion

N/A

728x90

+ Recent posts