デザインパターン - Mediator
【Mediatorパターンとは】
【Mediatorパターンのクラス図】
略
【Mediatorパターンのメリット】
複数のオブジェクトはお互いの状態を知る必要がなく、
Mediator役が制御を行う。
【サンプル】
Mediator.java |
package mediator;
//仲介者(Mediator)
public interface Mediator {
public abstract void addColleague(Colleague colleague);
public abstract void consultation(Colleague colleague);
}
|
Controller.java |
package mediator;
import java.util.HashMap;
import java.util.Map;
// 仲介者(Mediator)実装
public class Controller implements Mediator {
Map<String, Colleague> colleaguesMap = new HashMap<String, Colleague>();
@Override
public void addColleague(Colleague colleague) {
colleaguesMap.put(colleague.getName(), colleague);
}
@Override
public void consultation(Colleague colleague) {
String name = colleague.getName();
boolean status = colleague.getStatus();
if (!status) {
return;
}
while (i.hasNext()) {
String key = (String) i.next();
Colleague c = colleaguesMap.get(key);
if (!name.equals(c.getName())) {
// 状態を変更して
c.advice(!status);
}
}
}
}
|
Colleague.java |
package mediator;
// 仲介される側
public abstract class Colleague {
protected Mediator mediator;
protected String name;
protected boolean status = false;
public abstract void advice(boolean status);
public abstract void setStatus(boolean status);
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public String getName() {
return this.name;
}
public boolean getStatus() {
return this.status;
}
}
|
Person.java |
package mediator;
// 人
public class Person extends Colleague {
public Person(String name) {
super.name = name;
super.status = false;
}
public void setStatus(boolean status) {
this.changeStatus(status);
super.mediator.consultation(this);
}
private void changeStatus(boolean status) {
// 変更した場合のみ
if (super.status != status) {
super.status = status;
this.showInfo();
}
}
private void showInfo() {
if (this.status) {
System.out.println(super.getName() + "は手をあげました");
} else {
System.out.println(super.getName() + "は手をさげました");
}
}
// mediatorがアドバイスする
public void advice(boolean status) {
this.changeStatus(status);
}
}
|
MediatorTest.java |
package mediator;
public class MediatorTest {
/**
* 複数の人の中で同時に手を挙げる人は一人だけ
*/
public static void main(String[] args) {
Mediator m = new Controller();
Colleague p1 = new Person("PERSON1");
Colleague p2 = new Person("PERSON2");
Colleague p3 = new Person("PERSON3");
// メンバー設定
m.addColleague(p1);
m.addColleague(p2);
m.addColleague(p3);
// 仲介者設定
p1.setMediator(m);
p2.setMediator(m);
p3.setMediator(m);
// p1手あげ
p1.setStatus(true);
System.out.println("");
System.out.println("");
// p2手あげ
p2.setStatus(true);
System.out.println("");
System.out.println("");
// p3手あげ
p3.setStatus(true);
System.out.println("");
System.out.println("");
}
}
|
実行結果 |
PERSON1は手をあげました
PERSON2は手をあげました
PERSON1は手をさげました
PERSON3は手をあげました
PERSON2は手をさげました
|