Mediator(ちょうぜつ本)
集中コントロールをひとつ設ける
aとbが相互に知っていて呼び出す関係だとc,dと追加できない
サブパッケージ分けも可能になる
ObjectAとMediatorInterfaceAが同じサブパッケージ
連携用のインターフェースの実装をすべてメディエーターに集め、ObjectAとObjectBが直接関係を持たないかたちにした (Kindle版 p.371)
ObjectCが増えてもMediatorクラスだけの変更
ObjectAやBのサブパッケージは変更がない(安定)
要素同士がいつの間にか循環的な結びつきを作ってしまっていたときのリファクタリングのヒントとしてMediatorパターン
PHPコード読み解き
型宣言の項目あり
分からなかった:これらのプロパティはどう設定される?
インターフェースを指定したプロパティ
protected MediatorInterfaceA $mediator;
具象クラスを指定したプロパティ
protected ObjectA $a;
例のコードを使ってアプリケーションにしているコードがない
mediator自身を設定!!
aもbもmediatorを通して相互作用する
MediatorインスタンスのnotifyActivityDoneメソッドを呼ぶ(MediatorInterfaceAを実装しているので持つ)
notifyActivityDoneでは、Mediatorインスタンスが持つObjectBインスタンスのdoTaskメソッドを呼ぶ
ObjectBのdoTaskでは、ObjectBインスタンスが持つMediatorインスタンスのnotifyTaskCompletionメソッドを呼ぶ(MediatorInterfaceBで示されている)
notifyTaskCompletionでは、Mediatorインスタンスが持つObjectAインスタンスのfinishTheWorkメソッドを呼ぶ
ObjectAインスタンスの持つfinishTheWorkを実行
IMO:シーケンス図を考えるとよさそう
飲み会の支払いを1人にまとめる例が分かりやすい
コミュニケーションパスが減っている!
たった一人で収支計算しないといけない Mediator は、あらゆる調停に関係する知識が入ってくるので、そこだけはどうしても複雑になります。