3

パターンを使ったプログラミングは初めてです。パターン オブザーバーの Smalltalk 実装のサンプルを探すのに何時間も費やしましたが、無駄でした。誰かが Smalltalk でのこのパターンの実装の具体的なサンプルを提供してくれれば、私は感謝します。

4

3 に答える 3

12

Smalltalk で見られるオブザーバー パターンの標準的な実装は#changed/#updateメカニズムです。

こんなふうになります:

subject addDependent: anObserver.

subject changed.

そしてanObserversend を取得します#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 に答える