liguofeng29’s blog

個人勉強用ブログだっす。

デザインパターン - Mediator

【Mediatorパターンとは】

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.Iterator;
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;
}
 
Iterator<String> i = colleaguesMap.keySet().iterator();
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は手をさげました