我刚开始使用模式编程,我花了几个小时寻找模式观察器的Smalltalk实现的示例,但一无所获。如果有人能为我提供在Smalltalk下实现此模式的具体示例,我将不胜感激。
发布于 2013-06-13 17:08:50
在Smalltalk中,观察者模式的标准实现将是#changed/#update机制。
它是这样的:
subject addDependent: anObserver.
subject changed.然后anObserver获取发送#update
MyObservingObject>>update
"I got called in a #changed chain"
super update.
self doUpdatingStuff您可以使用#changed:和#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时,你会发现至少有三个其他的观察者实现:
和Morphic的事件处理(请参阅类似的、更通用的事件处理机制,请参阅Object>>#when:send:to:和Object>>#triggerEvent:
你可以在Signals project上找到这些的comparison,这是另一个实现,但灵感来自Qt。
发布于 2013-06-13 17:08:11
最简单的方法是这样:
在观察者类中:
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 ].但我也建议您在关于Announcements Framework的章节中阅读更多关于这个想法的内容
发布于 2013-06-14 04:28:30
另外,请看一下Announcements框架。
它比发送符号更具面向对象的特性。
干杯
https://stackoverflow.com/questions/17082576
复制相似问题