首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Smalltalk/VisualWorks中实现观察者模式

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

Stack Overflow用户
提问于 2013-06-13 16:30:17
回答 3查看 1.3K关注 0票数 3

我刚开始使用模式编程,我花了几个小时寻找模式观察器的Smalltalk实现的示例,但一无所获。如果有人能为我提供在Smalltalk下实现此模式的具体示例,我将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-13 17:08:50

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

它是这样的:

代码语言:javascript
复制
subject addDependent: anObserver.

subject changed.

然后anObserver获取发送#update

代码语言:javascript
复制
MyObservingObject>>update
  "I got called in a #changed chain"
  super update.
  self doUpdatingStuff

您可以使用#changed:#update:进行更精细的控制(请注意冒号):

代码语言:javascript
复制
subject addDependent: anObserver.
subject changed: subject.

代码语言:javascript
复制
MyObservingObject>>update: anObject
  "I got called in a #changed: chain"
  super update: anObject.
  self doUpdatingStuffWith: anObject

但是,通常使用符号来表示发生了什么变化:

代码语言:javascript
复制
subject addDependent: anObserver.
subject changed: #myNumbers.

代码语言:javascript
复制
MyObservingObject>>update: anObject
  "I got called in a #changed: chain"
  anObject == #myNumbers ifTrue: [
    self doUpdatingStuffForNumbers.
    ^ self "inhibits the super"].
  super update: anObject.

当你查看SqueakPharo时,你会发现至少有三个其他的观察者实现:

和Morphic的事件处理(请参阅类似的、更通用的事件处理机制,请参阅Object>>#when:send:to:Object>>#triggerEvent:

  • the公告框架,在类中封装主体和观察者之间的消息。

你可以在Signals project上找到这些的comparison,这是另一个实现,但灵感来自Qt。

票数 12
EN

Stack Overflow用户

发布于 2013-06-13 17:08:11

最简单的方法是这样:

在观察者类中:

代码语言:javascript
复制
observable: anObject
    observable := anObject.

observable
    ^ observable.

notify
    "do something here e.g.:"
    Transcript show: "Some things changed in ", observable asString.

在可观察性中:

代码语言:javascript
复制
initialize
    observers := OrderedCollection new.

addObserver: anObserver
    observers add: anObserver.

removeObserver: anObserver
    observers remove: anObserver.

notifyObservers
    observers do: [ :each | each notify ].

但我也建议您在关于Announcements Framework的章节中阅读更多关于这个想法的内容

票数 5
EN

Stack Overflow用户

发布于 2013-06-14 04:28:30

另外,请看一下Announcements框架。

它比发送符号更具面向对象的特性。

干杯

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17082576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档