仲介

mediator.png

簡単に言うと

アクセスしたいオブジェクトへのポインタを渡してるだけ
ポインタがないJavaではどうするかっていうと、内部クラスにすることによって達成している。

世の中には仲介人というものがいます。人から人に要求を出す際に直接出さずに仲介人を介して行うのです。
それは、仲介人がその分野について自分よりよく理解しているからであり、また煩雑なプロセスを代わりにやってくれるからであり、また自分に直接仕事をしてくれる人とのコネクションがないからです。

また、仲介人は、仕事を受け持つ側にとっても役立つものです。
自分が直接要求を受ける代わりに、いったん要求を受けて必要なことだけを自分に伝えてくれるので、自分は自分の仕事に専念できるのです。

クラス構成についても全く同じことが言えます。
クラスとクラスの間に立って、仲介を行います。
呼び出す側のクラスは、一連の決まりきった処理を自分自身では行わずに、他のオブジェクトに依頼して行います。
行いたい処理を直接呼び出さずに間にかますことがポイントです。
ここで取り上げるいずれのパターンも間に入って、仲介を行います。

ただし、あるクラスが仲介かどうかというのは、他クラスとの相対的な関係に過ぎません。呼び出し側のクラスから、仲介の先のクラスが見えなければ、その仲介のクラスが具体的な処理を行っているように見えます。実際、厳密に見れば、ほとんどのクラスは仲介を行っているだけです。[3]

これらのクラスは、○○Managerと名づけられることもあります。

難しく言うと

他のオブジェクトとの通信を仲介するオブジェクトを導入している。
この仲介役であるMediatorオブジェクトは、オペレーションを他のオブジェクトに単に転送するだけであったり、
あるいは、転送の際に自身への参照を一緒に渡す(これが真の委譲である。)ように実装されていたりする。

使用例

Listenerでよく使われる

mediatorクラス

template <class T>
class mediator{
public:
mediator(T* pT=NULL) : m_pT(pT){}
void SetOutClass(T* pT){m_pT=pT;}
T& GetOutClass() const{return *m_pT;}
private:
T* m_pT;
};
#define outer GetOutClass()
//これを用意しておけば、
//outerというキーワードをあたかも外部クラスを指定する
//演算子のように使うことができる

mediatorを使ったクラス

class CMyGUI : public CGUIButtonEventListener,public mediator<CMyClass>{
CMyGUI(CMClass *p) : mediator<CMyClass>(p){}//なんだこれ
virtual void OnButtonDown(){//ボタン押下の動作を定義
outer.member_of_my_class=true;
//↑CMyClassのメンバにアクセスしている!
}
};


manager mvc

サポートサイト Wikidot.com managermvc