在Smalltalk/VisualWorks中实现观察者模式

Sol*_*e87 3 smalltalk visualworks observer-pattern

我是用模式编程的新手,我花了几个小时搜索模式观察者的Smalltalk实现的样本但是徒劳无功.如果有人能够在Smalltalk下为我提供这种模式实现的具体示例,我将非常感激.

Tob*_*ias 12

在Smalltalk中找到的观察者模式的标准实现将是#changed/ #update机制.

它是这样的:

subject addDependent: anObserver.

subject changed.
Run Code Online (Sandbox Code Playgroud)

然后anObserver发送#update:

MyObservingObject>>update
  "I got called in a #changed chain"
  super update.
  self doUpdatingStuff
Run Code Online (Sandbox Code Playgroud)

您可以使用#changed:和更好地控制#update:(注意冒号):

subject addDependent: anObserver.
subject changed: subject.
Run Code Online (Sandbox Code Playgroud)

MyObservingObject>>update: anObject
  "I got called in a #changed: chain"
  super update: anObject.
  self doUpdatingStuffWith: anObject
Run Code Online (Sandbox Code Playgroud)

但是,通常会发现使用符号来表示更改的内容:

subject addDependent: anObserver.
subject changed: #myNumbers.
Run Code Online (Sandbox Code Playgroud)

MyObservingObject>>update: anObject
  "I got called in a #changed: chain"
  anObject == #myNumbers ifTrue: [
    self doUpdatingStuffForNumbers.
    ^ self "inhibits the super"].
  super update: anObject.
Run Code Online (Sandbox Code Playgroud)

当您查看SqueakPharo时,您将找到至少三个其他Observer实现:

  • Morphic的事件处理(见Morph>>#on:send:to:)
  • 一个类似的,更通用的事件处理机制,请参阅Object>>#when:send:to:Object>>#triggerEvent:
  • 公告框架,包封主体和观察者在类之间的消息.

您可以在Signals项目中找到这些比较,这是另一个实现,但受到Qt的启发.


Uko*_*Uko 5

最简单的方法是这样的:

在Observer类中:

observable: anObject
    observable := anObject.

observable
    ^ observable.

notify
    "do something here e.g.:"
    Transcript show: "Some things changed in ", observable asString.
Run Code Online (Sandbox Code Playgroud)

在Observable中:

initialize
    observers := OrderedCollection new.

addObserver: anObserver
    observers add: anObserver.

removeObserver: anObserver
    observers remove: anObserver.

notifyObservers
    observers do: [ :each | each notify ].
Run Code Online (Sandbox Code Playgroud)

但我也建议你在关于公告框架的章节中阅读更多关于这个想法的内容