![]() |
[1999 年 7 月号] |
[Happy Squeaking!!]
パターンは、それが扱う問題のスケールや種類によっていくつかに分類することができます。
Smalltalkの世界では、Observerがパターンとして認識されるよりもはるか昔から、Observerの仕組みを実現していました。
1983年の"Smalltalk-80: The Language
and Its Implementation"においてオブジェクト間の3種類の関係として以下のような定義がされています。
3番目の関係がまさにObserverがSubjectを監視する関係を表しています。
異なるオブジェクト間での協調動作をスマートに行うやり方としてdependencyは考え出されたのです。
dependencyは主にMVCフレームワークにおいて、MからVに対して間接的に変更通知を行う際に使われていますが、適用範囲はなにもMVCに限る必要はありません。
dependencyメカニズムの基本実装は、Objectクラスで定義されています。これは、全てのオブジェクトが、ObserverにもSubjectにもなれるということを示しています。(Modelクラスでは、より効率的な実装としてdependencyメカニズムを提供しています)。
SmallTip: Smalltalkでは、Observerパターンの実装としてdependencyメカニズムが提供されている |
ここでは基本的なObserverの実装として、MVCとは独立させて、dependencyの仕組みを試してみることにしましょう。
まずはObjectクラスをブラウズしてみます。
Objectクラスの"dependents access"メッセージカテゴリのブラウズ
まず、ObjectをSubjectとして考えましょう。
SubjectはObserverを登録、削除できなければなりません。
従って、メッセージカテゴリ "dependents
access"には、Dependent(Observer)の登録、削除に関する操作が格納されています。(addDepentdent:
、removeDependent: など)
また、Subjectは、自分の状態変更を通知できる必要があります。
メッセージカテゴリ updatingには、通知用のメソッド
changed:を見ることができます。
(Object >> updatingカテゴリ)
changed: aParameter "…コメントは省略..." self dependents do: [:aDependent | aDependent update: aParameter]
依存物リスト(dependents)に登録された全てのDependent(Observer)に対してupdate: のメッセージを送るように実装されています。
次にObjectをObserverとして考えましょう。
Observerは、Subjectの変更通知を受け取る操作を持っていなければなりません。これが、changed内で送られていたupdate:になります。
Objectクラスの"updating"メッセージカテゴリのブラウズ
デフォルトではupdate:の中身は空になっています。Dependent(Observer)は、update: をオーバイライドして、適切な処理を実行します。
更新受け取り操作のupdate: は引数をとります。引数は何でもいいのですが、通常は、Subjectのどの属性が変化したのかを示す情報を渡します.
(Smalltalkの世界ではこれをAspect-側面と呼びます)。
SmallTip: 変更通知はchanged:メッセージを自身に送る |
SmallTip: 変更の受け取りはupdate:メッセージ |
© 1999-2001 OGIS-RI Co., Ltd. |
|