Design patterns
メディエーターパターン
サーチ…
Javaのメディエーターパターンの例
Mediatorパターンは、一連のオブジェクトがどのように相互作用するかをカプセル化するオブジェクト(Mediator)を定義します。多対多の通信が可能です。
UML図:
主要コンポーネント:
Mediator:
同僚間のコミュニケーションのためのインターフェイスを定義します。
Colleague
: Colleague
間でやりとりされるイベントを定義する抽象クラスです
ConcreteMediator
: Colleague
オブジェクトを調整し、 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
説明:
-
Eagle
は、最初に登録イベントでネットワークに追加されます。 Eagleが最初のものであるため、他の同僚には通知がありません。 -
Ostrich
がネットワークに追加されると、Eagle
に通知されます。出力の1行目がレンダリングされます。 -
Penguin
がネットワークに追加されると、Eagle
とOstrich
両方に通知されます。出力の2行目と3行目がレンダリングされます。 -
Eagle
が登録抹消イベントでネットワークを去った時、Ostrich
とPenguin
両方に通知されました。出力の4行目と5行目がレンダリングされます。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow