パターンを使ったプログラミングは初めてです。パターン オブザーバーの Smalltalk 実装のサンプルを探すのに何時間も費やしましたが、無駄でした。誰かが Smalltalk でのこのパターンの実装の具体的なサンプルを提供してくれれば、私は感謝します。
質問する
1334 次
3 に答える
12
Smalltalk で見られるオブザーバー パターンの標準的な実装は#changed
/#update
メカニズムです。
こんなふうになります:
subject addDependent: anObserver.
subject changed.
そしてanObserver
send を取得します#update
:
MyObservingObject>>update
"I got called in a #changed chain"
super update.
self doUpdatingStuff
#changed:
and を使用すると、より細かく制御できます#update:
(コロンに注意してください)。
subject addDependent: anObserver.
subject changed: subject.
と
MyObservingObject>>update: anObject
"I got called in a #changed: chain"
super update: anObject.
self doUpdatingStuffWith: anObject
ただし、何が変更されたかを示すために記号を使用することがよくあります。
subject addDependent: anObserver.
subject changed: #myNumbers.
と
MyObservingObject>>update: anObject
"I got called in a #changed: chain"
anObject == #myNumbers ifTrue: [
self doUpdatingStuffForNumbers.
^ self "inhibits the super"].
super update: anObject.
SqueakまたはPharoを見ると、他に少なくとも 3 つの Observer 実装が見つかります。
- Morphic のイベント処理 ( を参照
Morph>>#on:send:to:
) - 同様の、より一般的なイベント処理メカニズムについては、 および を参照
Object>>#when:send:to:
してください。Object>>#triggerEvent:
- クラス内のサブジェクトとオブザーバーの間のメッセージをカプセル化するアナウンス フレームワーク。
これらの比較は、別の実装であるSignals プロジェクトで見つけることができますが、Qt に触発されています。
于 2013-06-13T09:08:49.593 に答える
5
最も簡単な方法は次のようなものです。
オブザーバー クラス:
observable: anObject
observable := anObject.
observable
^ observable.
notify
"do something here e.g.:"
Transcript show: "Some things changed in ", observable asString.
そしてオブザーバブルで:
initialize
observers := OrderedCollection new.
addObserver: anObserver
observers add: anObserver.
removeObserver: anObserver
observers remove: anObserver.
notifyObservers
observers do: [ :each | each notify ].
ただし、アナウンス フレームワークに関する章で、このアイデアについて詳しく読むことをお勧めします。
于 2013-06-13T09:08:11.277 に答える
2
于 2013-06-13T20:28:29.917 に答える