「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からの相談がありましたよ。