はじめに
本記事は、デザインパターン学習中の私が学習中に詰まったポイント、間違えてしまったポイントをもとに学んだことを書いたものです。
個人の理解に基づいておりますため、間違いがあれば教えていただけると幸いです。
★9ヶ月前くらいにデザインパターンの勉強のために執筆し、社内で公開していた記事をこちらにも投稿したものとなります。
違いがわからない
ObserverパターンとMediatorパターンは、どちらもオブジェクトからの通知を受け取って、それをもとに何か処理をするパターンであると学習で理解したつもりでした。しかし、「じゃあ学んだことを記事にしよう!」と思った段階で、二つのパターンの違いがあまり理解できていなかったと気付いたため、少し調べてみました。
Mediator(調停者)パターン
まず、Mediatorパターンは、Mediator(調停者)という名の通り、 複数のクラスからの通知を受け取ってそれぞれをいい感じに調停するというパターン です。Mediatorクラスが通知をもとに各クラスに指示を出すため、通知を出す側のクラス群はお互いを知る必要がありません。
例えば、「テキストボックスAに文字を入力してボタンBを押すとテキストブロックCに文字が表示される」といったプログラムの場合、テキストボックスAのクラスとボタンBのクラスは、テキストブロックCのことを知る必要がありません。
Mediatorクラスへ「テキストボックスAに文字が入力されました」「ボタンBが押されました」という通知を出せばよいのです。「テキストボックスAに入力があり、ボタンBが押されたから、テキストブロックCに文字を表示するように指示をする」のはMediatorクラスの仕事になります。
Observer(観察者)パターン
次に、Observerパターンは、 観察対象のクラスの変化を観察するパターン です。観察とは言っていますが、Observerクラス自身が能動的に観察対象の変化を監視している訳ではなく、逆に観察対象のクラスがObserverクラスに対して、「自身に何かしらの変化がありました」という通知を出しているのです。
例えば、「テキストボックスAに文字を入力する」というプログラムについて、Observerパターンは「50ミリ秒ごとにテキストボックスの状態を取得して変化を検知する」ということをするのではなく、「テキストボックスAに何か文字が入力されたら、テキストボックスAがObserverクラスに通知を出す」のです。
そのような特性から、Publish(出版)-Subscribe(購読)パターンとも呼ばれます。
Observerパターンは、このように通知に重点を置いたパターンですが、「通知を出したクラスに何か処理をさせたい」ということもあると思います。例えば、「テキストボックスAに文字を入力してボタンBを押したら、テキストボックスAを入力不可にしたい」といった場合です。
その場合には前述のMediatorパターンで解決できます。Observerパターンは、Mediatorパターンの「複数のクラスからの通知」の部分に活用することができるのです。
まとめ
ObserverパターンとMediatorパターンは「オブジェクトからの通知を受け取って、それをもとに何か処理をするパターン」というふうに認識していました。
しかし、Observerパターンの主眼はあくまでも「 状態変化を通知すること 」にあり、観察対象が何クラスあるかや、それをもとに何か処理をするかどうかはパターンの範囲外でした。
逆に、Mediatorパターンは「 複数のクラスからの通知を元に判断を行い、各クラスへ指示を出すこと 」に主眼があるため、クラスは複数ある前提で、通知を元に何らかの処理を行うところまでがパターンです。Observerパターンは片方向、Mediatorパターンは双方向に通信を行うパターンであるということですね。
State・Strategyパターン(クラス図が同じ・使い方が違う)の際にも思いましたが、パターン自体に共通する部分があっても、パターンのキモになる部分や解決できる問題が違えば違うパターンであり、むしろ似ているからこそ違いを理解しておく必要があると思いました。
◆◆◆
最後まで読んでいただき、ありがとうございました。
以下は前回のデザインパターンの記事です。よければ合わせてどうぞ。
【デザインパターン】悪戦苦闘!デザインパターン ~State・Strategy編~
【デザインパターン】悪戦苦闘!デザインパターン ~Proxy・Flyweight編~