Mediator パターン

「Mediator」という英単語は、「仲介者」を意味します。

このパターンは、複雑に絡み合った複数のオブジェクト間の関係を、必ず「仲介者」を介して処理を行う様にすることで単純かつ明快なインタフェースを提供するパターンです。つまり、「Mediator」パターンとは、管轄下にある複数のオブジェクト各々からの問い合わせを受け、適宜判断を行い、管轄下にあるオブジェクト全体、または一部へ指示を出す「仲介人」の役割を果たすクラスを利用するパターンです。


役割り

1. Mediator(仲介者)
「Colleague」からの相談を一手に引受け、またそれを元に判断を下し、「Colleague」へ指示を出します。各「Colleague」からの相談受付の窓口インタフェースを定義します。(consultation)管轄下に置く「Colleague」を格納するためのインタフェースを定義する。(addColleague)
2. ConcreteMediator(具体的な仲介者)
「Mediator」のインタフェースを実装します。実際に「Colleague」を保持し、それらから相談を受け、判断を下し、それらに指示を出します。
3. Colleague(同僚)
他の「Colleague」を制御したい場合は、「Mediator」に相談します。「Mediator」からの指示をうける窓口インタフェースを定義します。(advice)自身が相談する「Mediator」を格納保持するためのメソッドを定義します。(setMediator)
4. ConcreteColleagueA・B(具体的な同僚)
「Colleague」のインタフェースを実装します。
5. Client(利用者)
「Mediator」パターンを適用したクラスを用い処理を行います。

▲PageTop

クラス図

Mediatorパターンのクラス図

Mediatorパターン クラス図

▲PageTop

サンプル

ソースコード

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

▲PageTop