Mediator パターン

デザインパターンちゃんと勉強をしようと思ったので結城さんの本を 1 つ 1 つ実装してみる。 前回の Facadeからの続き。

プログラムは複数の(時には多数の)クラスからなり、ロジックと計算がクラスに配置される。しかし、プログラムでクラスの数が増えるに従い、特に保守やリファクタリングをする際、クラス間の通信の問題が複雑になり、プログラムを読んだり保守したりすることが困難になる。さらに、他のクラスに影響を与える可能性があるため、変更も難しくなる。Mediator パターンを用いると、オブジェクト間の通信は mediator によってカプセル化され、オブジェクト同士で直接通信せず、mediator を介して行うようになる。

クラス図

Mediator PlantUML

今回はじめて書籍の例とは違った形で実装した。書籍内の例がウィンドウプログラムを作るためのものであったため、PHP での実装はちと厳しいかなと思い以下のサイトのものを実装している。クラス図はそちらを元に作っている。

チャットルームを作り、そちらにユーザを登録してチャットをやり取りする簡単なもの。ただ、こちらの例にも User 側の対応が 1 つしかなく、汎用性が足りないかなと感じたので、通常のユーザー(UserDefault)と管理者ユーザー(UserAdmin)に分けて両方のユーザーに通知を出してメッセージの表示だけを変更している。

例として各ユーザでの処理を振り分けているという事を考えると ↓ こちらの例の方が適切だったかも。

自分としての理解・疑問

  • 情報の流れを 1 つの場所に集約するのはわかるけど、オブジェクトのやりとりで集約させるのは集約になっているんだろうかという疑問はあったりする。逆に混乱するんじゃないの?