【デザインパターン】Mediatorパターンをクラス図で理解する

デザインパターン

Mediatorパターン

Mediatorパターンは、オブジェクト同士のメッセージのやりとりを仲介するオブジェクトを用意するデザインパターンです。
自分なりにMediatorパターンをクラス図にまとめてみました。

Mediatorパターンのクラス図

Mediatorパターンのクラス図

Mediatorパターンのクラス図

Mediatorパターンのクラス図の解説

あるオブジェクト間でやりとりをする場合、そのオブジェクトをColleague1,2型のオブジェクトとし、Colleague1,2の親クラスであるColleagueクラスを用意します。
Colleagueクラスは属性にMediator型の変数を持ち、このmediator属性が仲介役を担当するオブジェクトとなります。

仲介の仕方は、mediator属性のmediateメソッドを用いて行います。
第一引数と第二引数にColleague型のオブジェクトを渡し、第三引数以降に仲介時にやりとりしたい値を渡すようにMediator1クラスを実装します。
Colleague型のオブジェクトは、setMediatorメソッドの引数にMediator1型のオブジェクトを入れて、自身の属性mediatorにセットします。
そして、sendMessageメソッド内で、mediatorオブジェクトのmediateメソッドを呼び出します。その際に、自オブジェクトを第一引数、メッセージを送りたいオブジェクトを第二引数、送るメッセージを第三引数にセットします。
そうすることで、直接Colleague1,2オブジェクト間でやりとりを行わずに、Mediatorオブジェクトを介してやりとりが行われることになります。

一方Mediator側は、属性colleaguesにColleagueオブジェクト配列を設け、やりとりをするオブジェクトを格納しておきます。この配列の何番目からきたメッセージを何番目に渡すかを処理するのがMediator1クラスのmediateメソッドになります。

Mediatorパターンをどういう場合に使うか

Mediatorパターンは、Colleagueの種類が多くなる場合に有効で、例えばチャットのやりとりのように複数人のうち誰かから誰かにメッセージを送るような場合にMediatorパターンを当てはめることができます。

PlantUMLでMediatorパターンのクラス図を記述する

Mediatorパターンのクラス図をPlantUMLで書いたときのソースです。

@startuml Visitor
interface Mediator{
  # {abstract} addColleague(Colleague) : void
  # {abstract} mediate(Colleague, Colleague, args) : void 
}
class Mediator1 implements Mediator{
  - colleagues : Colleague[]
  --
  # addColleague(Colleague) : void
  # mediate(Colleague, Colleague, args) : void
}
abstract class Colleague {
  - mediator : Mediator
  --
  + setMediator(Mediator) : void
  + {abstract} sendMessage(Colleague, args): void
}
class Colleague1 extends Colleague{
  + sendMessage(Colleague, args) : void
}
class Colleague2 extends Colleague{
  + sendMessage(Colleague, args) : void
}
Mediator1 o-u-> Colleague
Colleague o-l-> Mediator
@enduml

参考サイトURL

Mediatorパターン – Qiita
Mediator パターン (オブジェクト同士が互いに参照し合うことがないように, 仲介役となるオブジェクトを介して制御を行う方法を提供する) — WTOPIA v1.0 documentation
PHPによるデザインパターン入門 – Mediator〜すべては相談役が知っている – Do You PHP はてブロ