サーチ…


Javaのメディエーターパターンの例

Mediatorパターンは、一連のオブジェクトがどのように相互作用するかをカプセル化するオブジェクト(Mediator)を定義します。多対多の通信が可能です。

UML図:

メディエータ図

主要コンポーネント:

Mediator:同僚間のコミュニケーションのためのインターフェイスを定義します。

ColleagueColleague間でやりとりされるイベントを定義する抽象クラスです

ConcreteMediatorColleagueオブジェクトを調整し、 Colleagueを維持することによって協調行動を実装する

ConcreteColleague :他のColleagueによって生成されたMediatorを通じて受け取った通知操作を実装します。

1つの実世界の例:

Meshトポロジでコンピュータのネットワークを維持しています。

メッシュネットワークは、各ノードがネットワークのデータを中継するネットワークトポロジです。すべてのメッシュノードは、ネットワーク内のデータの配信に協力します。

新しいコンピュータが追加された場合、または既存のコンピュータが削除された場合、そのネットワーク内の他のすべてのコンピュータは、これらの2つのイベントについて知っている必要があります。

Mediatorパターンがどのようにそれに適合するかを見てみましょう。

コードスニペット:

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両方に通知されました。出力の4行目と5行目がレンダリングされます。


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow