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)
当您查看Squeak或Pharo时,您将找到至少三个其他Observer实现:
Morph>>#on:send:to:)Object>>#when:send:to:和Object>>#triggerEvent:您可以在Signals项目中找到这些比较,这是另一个实现,但受到Qt的启发.
最简单的方法是这样的:
在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)
但我也建议你在关于公告框架的章节中阅读更多关于这个想法的内容