「Mediator」という英単語は、「仲介者」を意味します。
このパターンは、複雑に絡み合った複数のオブジェクト間の関係を、必ず「仲介者」を介して処理を行う様にすることで単純かつ明快なインタフェースを提供するパターンです。つまり、「Mediator」パターンとは、管轄下にある複数のオブジェクト各々からの問い合わせを受け、適宜判断を行い、管轄下にあるオブジェクト全体、または一部へ指示を出す「仲介人」の役割を果たすクラスを利用するパターンです。
Mediatorパターンのクラス図
1. Mediator.java
public abstract class Mediator { public abstract void addColleague(Colleague colleague); public abstract void consultation(Colleague colleague); }
2. ConcreteMediator.java
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class ConcreteMediator extends Mediator { Map<String, Colleague> colleagues = new HashMap<String, Colleague>(); public void addColleague(Colleague colleague) { colleagues.put(colleague.getName(), colleague); } public void consultation(Colleague colleague) { String name = colleague.getName(); System.out.println(name + "からの相談です。"); Iterator<String> it = colleagues.keySet().iterator(); while (it.hasNext()) { Colleague colleagueTmp = (Colleague) colleagues.get(it.next()); if (!(colleagueTmp.getName().equals(colleague.getName()))) { colleagueTmp.advice(name + "からの相談がありましたよ。"); } } } }
3. Colleague.java
public abstract class Colleague { protected Mediator mediator; private String name; public Colleague(String name) { this.name = name; } public String getName() { return name; } public void setMediator(Mediator mediator) { this.mediator = mediator; } public abstract void advice(String msg); public abstract void run(); }
4-1. ConcreteColleagueA.java
public class ConcreteColleagueA extends Colleague { public ConcreteColleagueA(String name) { super(name); } public void run() { mediator.consultation(this); } public void advice(String msg) { System.out.println("ConcreteColleagueA:" + msg); } }
4-2. ConcreteColleagueB.java
public class ConcreteColleagueB extends Colleague { public ConcreteColleagueB(String name) { super(name); } public void run() { mediator.consultation(this); } public void advice(String msg) { System.out.println("ConcreteColleagueB:" + msg); } }
5. Client.java
public class Client { public static void main(String[] args) { Mediator mediator = new ConcreteMediator(); Colleague colA = new ConcreteColleagueA("A"); Colleague colB = new ConcreteColleagueB("B"); mediator.addColleague(colA); mediator.addColleague(colB); colA.setMediator(mediator); colB.setMediator(mediator); colA.run(); colB.run(); } }
C:\sample\desin_pattern\mediator>javac Client.java [Enter] C:\sample\desin_pattern\mediator>java Client [Enter] Aからの相談です。 ConcreteColleagueB:Aからの相談がありましたよ。 Bからの相談です。 ConcreteColleagueA:Bからの相談がありましたよ。