読み方はメディエイター。仲介者、調停者、まとめ役のこと。
2つのオブジェクトがそれぞれ連携しあって動作するような場合、それぞれのオブジェクトが別のオブジェクトを監視していればよい。ところがもっと数が増え、3つ、4つになってくると大変である。そこでまとめ役のオブジェクトを用意し、まとめ役がそれぞれのオブジェクトに対して指示を出す。それぞれのオブジェクトはまとめ役からのみ指示を受けるようにする。
たとえば、RPGのゲームで手に持つアイテムを選択するメニューの場合。片手剣、両手斧、盾の3種類あったとして、剣を選んだときは斧は選べなくなり、斧を選んだら剣、盾の両方が選べなくなる。このようにメニューの項目が連動するような場合にまとめ役となるMediatorを用意すればよい。
Mediator.java まとめ役
public interface Mediator { public abstract void colleagueChanged(Colleague colleague); }
Colleague.java colleague(コリーグ)は同僚のこと。つまり、まとめ役にまとめられるメンバー。
public interface Colleague { public abstract void setMediator(Mediator mediator); public abstract void setColleagueEnabled(boolean enabled); }
Sword.java 剣クラス。斧や盾もクラス名が違うだけでほぼ同じ。
public class Sword implements Colleague { private Mediator mediator; private boolean enable; public void setMediator(Mediator mediator) { this.mediator = mediator; enable = true; } public void setColleagueEnabled(boolean enabled) { enable = enabled; } // 選択されたとき public void setSelect() { mediator.colleagueChanged(this); } }
Menu.java まとめ役となるメニュークラス。
public class Menu implements Mediator { private Sword sword; private Axe axe; private Shield shield; public Menu() { // Colleagueたちの生成 sword = new Sword(); axe = new Axe(); shield = new Shield(); // Mediatorのセット sword.setMediator(this); axe.setMediator(this); shield.setMediator(this); } // Colleagueのどれかが選ばれたとき呼ばれる public void colleagueChanged(Colleague colleague) { if ( colleague == sword || colleague == shield ) { // 盾を選べなくする axe.setColleagueEnabled(false); } else if ( colleague == axe ) { // 剣と盾を選べなくする sword.setColleagueEnabled(false); shield.setColleagueEnabled(false); } } }
※ソースはイメージを表したもので、実際にはこのまま入力しても動作しない。
剣、斧、盾が選択されたときにはメニュークラスのcolleagueChanged()が呼ばれ、その中で選択できなくなる項目を設定している。
参考文献:Java言語で学ぶデザインパターン入門
参考:ギコ猫とMediatorパターン