イメージ図
基本的な仕組み
Subject(通知者)の方にObserverのインスタンス(購読者、Observer1、Observer2)を投げておいて、Subjectの方に通知してもらう形に実装します。
Subject
add
Observerをlistなどに追加します。
remove
Observerをlistから削除します。
notify
Observerに通知します。Observerインスタンスのupdateメソッドを呼びます。(for文で回して全てのObserverに対してupdateを実行します。)
なお、delegateなどを使っている場合は、invokeで一発でできます。
Subject側の実装方針
Subjectを抽象クラスにするか、staticクラスにするか。
staticクラス
シンプルに実装するのであればこれで問題ありません。
抽象クラス
テスト駆動の観点で言えば抽象クラスにした方がテストコードは書きやすくなります。staticクラスだと本当に動かさないといけないのでテストがしずらいです。
本来は実データを読み込みにいくが、フェイクデータを読み込みにいくような実装に変更したりします。
IObserver
ただ、1個1個インスタンスをSubjectから呼ぶようにするのはだるいですし、疎結合にしたいということで、Observerをインターフェース化しておいてSubject側からはそれを呼ぶようにします。
命名
「INotify」などと付けます。
Observerの実装クラス
Subjectはインスタンス変数で保持しておきます。(集約)
update
Subject側で通知時に呼ばれるメソッドです。実装クラスでは通知時に実行したい処理を実装しておきます。
インスタンス生成時
Subjectにインスタンスを追加します。(Subjectのaddを呼びます。)
インスタンス破棄時
Subjectからインスタンスを破棄します。(Subjectのremoveを呼びます。)
この記事へのコメントはありません。