수색…


자바의 중재자 패턴 예제

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

설명:

  1. Eagle 은 처음 등록 이벤트를 통해 네트워크에 추가됩니다. Eagle이 첫 번째 동료이기 때문에 다른 동료에게 알리지 않습니다.
  2. Ostrich 가 네트워크에 추가되면 Eagle 에 통지됩니다. 이제 출력의 1 행이 렌더링됩니다.
  3. Penguin 이 네트워크에 추가되면 EagleOstrich 가 모두 알려졌습니다. 출력의 2 행과 3 행이 이제 렌더링됩니다.
  4. Eagle 등록 취소 이벤트를 통해 네트워크를 나갔을 때, OstrichPenguin 은 모두 통지되었습니다. Line 4와 Line 5가 출력됩니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow