ObjectSquare [1999 年 7 月号]

[Happy Squeaking!!]


6. 事例:Observerパターン


ここでは「デザインパターン」の例として、Observerパターンを取り上げることにします。これはデザインパターンに関する多くの書籍で必ずといって紹介されるオーソドックスなパターンです。

パターンは通常「問題」「解決策」などの構成要素が明確になるように、テンプレートの穴埋め形式で記述されるのが普通です。ここでもそれに従ってみることとします。

問題

ある一つのオブジェクトの状態変化に対し、他の複数のオブジェクトが同時に依存している場合がある。例えばあるモデルのデータの最新情報を表示するビューは、モデルの状態変化に応じて再表示を行わなければならない。これら複数の異なるビューが、一つのモデルを参照している。
モデルの状態とビューの表示を一貫性のある形にするには、相互の協調が不可欠だが、モデルがあらかじめ多様に発展していくビューの全て知っており、それぞれに応じて再表示の要求を送るのは困難である。またモデルがビューに直接更新を要求すると、モデルとしてのクラスの独立性が失われてしまう。

制約

解決策

あるオブジェクトの状態変化を受け取る側は、変更を観察するもの、Observerとして抽象的にとらえられる。変更の起こる側は、Observerにとって関心のあるSubjectである。ObserverとSubjectといった抽象レベルで、Subjectに対するObserverの登録、また登録されたObserverに対する通知の仕組みを用意することで、相互の密な結合を防ぐ。

構造

以下のような構成要素から成り立つ

以下のようなクラス図となる。

振る舞い(協調関係)

登録

  1. 関心のあるConcreteSubjectに対してConcreteObserverの登録(addObserver:)が行われる
  2. ConcreteSubjectは自身のリスト(dependents)にConcreteSubjectを追加する

通知

  1. ConcreteSubjectの状態が、更新操作の起動により変化する。
  2. ConcreteSubjectは自身の状態変化に伴い、通知用の操作(changed:)を起動する
  3. ConcreteSubjectに登録した全てのConcreteObserverの通知受け取り操作(update:)が起動される
  4. 通知受け取り操作でConcreteObserverは最新ConcreteSubjectの最新状態を取得し適切な処理を行う

以下のようなコラボレーション図となる。

効果、副作用

別名

Publisher-Subscriber
(Subject、Observerにそれぞれ該当する。定期購読申込者に最新の雑誌が届く連想から)
Dependents
(ObserverはSubjectに対し、通常の関連に比べ結合度の弱い依存関係を持つため)

パターンテンプレートを使った書き方は、慣れていないと読みにくいかもしれません。しかし、きちんとしたドキュメントとしてパターンを残していくという点では有効な方法といえるでしょう。


© 1999-2001 OGIS-RI Co., Ltd.

Prev.

Index

Next