Design patterns
중재자 패턴
수색…
자바의 중재자 패턴 예제
Mediator 패턴은 객체 집합이 상호 작용하는 방식을 캡슐화하는 객체 (Mediator)를 정의합니다. 다 - 대 - 다 통신을 가능하게합니다.
UML 다이어그램 :
주요 구성 요소 :
Mediator:
동료 간 통신을위한 인터페이스를 정의합니다.
Colleague
: 동료간에 전달되는 이벤트를 정의하는 추상 클래스입니다.
ConcreteMediator
: Colleague
객체를 조정하여 협동 동작을 구현하고 동료를 유지 관리합니다.
ConcreteColleague
: 다른 Colleague
가 생성 한 Mediator
를 통해받은 알림 작업을 구현합니다.
하나의 실세계 예 :
Mesh
토폴로지에서 컴퓨터 네트워크를 유지 관리하고 있습니다.
메쉬 네트워크는 각 노드가 네트워크에 대한 데이터를 중계하는 네트워크 토폴로지입니다. 모든 메쉬 노드는 네트워크의 데이터 분배에 협력합니다.
새 컴퓨터가 추가되거나 기존 컴퓨터가 제거되면 해당 네트워크의 다른 모든 컴퓨터는이 두 가지 이벤트에 대해 알아야합니다.
중재자 패턴이 그것에 어떻게 들어 맞는지 봅시다.
코드 스 니펫 :
import java.util.List;
import java.util.ArrayList;
/* Define the contract for communication between Colleagues.
Implementation is left to ConcreteMediator */
interface Mediator{
void register(Colleague colleague);
void unregister(Colleague colleague);
}
/* Define the contract for notification events from Mediator.
Implementation is left to ConcreteColleague
*/
abstract class Colleague{
private Mediator mediator;
private String name;
public Colleague(Mediator mediator,String name){
this.mediator = mediator;
this.name = name;
}
public String toString(){
return name;
}
public abstract void receiveRegisterNotification(Colleague colleague);
public abstract void receiveUnRegisterNotification(Colleague colleague);
}
/* Process notification event raised by other Colleague through Mediator.
*/
class ComputerColleague extends Colleague {
private Mediator mediator;
public ComputerColleague(Mediator mediator,String name){
super(mediator,name);
}
public void receiveRegisterNotification(Colleague colleague){
System.out.println("New Computer register event with name:"+colleague+
": received @"+this);
// Send further messages to this new Colleague from now onwards
}
public void receiveUnRegisterNotification(Colleague colleague){
System.out.println("Computer left unregister event with name:"+colleague+
":received @"+this);
// Do not send further messages to this Colleague from now onwards
}
}
/* Act as a central hub for communication between different Colleagues.
Notifies all Concrete Colleagues on occurrence of an event
*/
class NetworkMediator implements Mediator{
List<Colleague> colleagues = new ArrayList<Colleague>();
public NetworkMediator(){
}
public void register(Colleague colleague){
colleagues.add(colleague);
for (Colleague other : colleagues){
if ( other != colleague){
other.receiveRegisterNotification(colleague);
}
}
}
public void unregister(Colleague colleague){
colleagues.remove(colleague);
for (Colleague other : colleagues){
other.receiveUnRegisterNotification(colleague);
}
}
}
public class MediatorPatternDemo{
public static void main(String args[]){
Mediator mediator = new NetworkMediator();
ComputerColleague colleague1 = new ComputerColleague(mediator,"Eagle");
ComputerColleague colleague2 = new ComputerColleague(mediator,"Ostrich");
ComputerColleague colleague3 = new ComputerColleague(mediator,"Penguin");
mediator.register(colleague1);
mediator.register(colleague2);
mediator.register(colleague3);
mediator.unregister(colleague1);
}
}
산출:
New Computer register event with name:Ostrich: received @Eagle
New Computer register event with name:Penguin: received @Eagle
New Computer register event with name:Penguin: received @Ostrich
Computer left unregister event with name:Eagle:received @Ostrich
Computer left unregister event with name:Eagle:received @Penguin
설명:
-
Eagle
은 처음 등록 이벤트를 통해 네트워크에 추가됩니다. Eagle이 첫 번째 동료이기 때문에 다른 동료에게 알리지 않습니다. -
Ostrich
가 네트워크에 추가되면Eagle
에 통지됩니다. 이제 출력의 1 행이 렌더링됩니다. -
Penguin
이 네트워크에 추가되면Eagle
과Ostrich
가 모두 알려졌습니다. 출력의 2 행과 3 행이 이제 렌더링됩니다. -
Eagle
등록 취소 이벤트를 통해 네트워크를 나갔을 때,Ostrich
와Penguin
은 모두 통지되었습니다. Line 4와 Line 5가 출력됩니다.
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow