我初次接触编程模式,花了几个小时搜寻Smalltalk实现观察者模式的样例,但都没有成功。 如果有人能够提供一个具体的关于在Smalltalk中实现此模式的样例,那就万分感谢。
我初次接触编程模式,花了几个小时搜寻Smalltalk实现观察者模式的样例,但都没有成功。 如果有人能够提供一个具体的关于在Smalltalk中实现此模式的样例,那就万分感谢。
在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.
Morph>>#on:send:to:
)Object>>#when:send:to:
和Object>>#triggerEvent:
changed
消息是默认调用的吗?例如,当向集合中添加/删除某些内容时,可以假设其依赖项将被更新吗? - Mr Tsjolder#changed
和 #changed:
的发送者。 - Tobias#changed
和 #changed
的发送者?为了获得这种行为,最佳实践是什么?更改现有类的源代码(例如某些 Collection
实现)或创建子类以添加该行为? - Mr Tsjolder#changed
。此外,您通常不会对集合进行子类化。一个好的方法是创建您的领域模型类,该类保存集合(组合)并在添加到其集合时发送#changed
。 - Tobiasobservable: 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 ].
但我建议您在有关通知框架的章节中更多地了解这个想法。