标签: observer-pattern

Rails 3:如何在观察者中识别after_commit动作?(创建/更新/销毁)

我有一个观察者,我注册了一个after_commit回调.如何判断它是在创建或更新后被触发的?我可以通过询问来判断某个项目已被销毁item.destroyed?但是#new_record?因为该项目已保存而无法正常工作.

我打算通过添加after_create/ after_update并执行类似于@action = :create内部的操作并检查@actionat 来解决它after_commit,但似乎观察者实例是单例,我可能只是在它到达之前覆盖一个值after_commit.所以我以一种更丑陋的方式解决了这个问题,根据after_create/update上的item.id将动作存储在地图中,并在after_commit上检查它的值.真的很难看

还有其他方法吗?

更新

正如@tardate所说,transaction_include_action?虽然它是一种私有方法,但它是一个很好的指示,并且在观察者中它应该被访问#send.

class ProductScoreObserver < ActiveRecord::Observer
  observe :product

  def after_commit(product)
    if product.send(:transaction_include_action?, :destroy)
      ...
Run Code Online (Sandbox Code Playgroud)

不幸的是,该:on选项在观察者中不起作用.

只要确保你测试你的观察者的地狱(test_after_commit如果你使用use_transactional_fixtures 寻找宝石)所以当你升级到新的Rails版本时,你会知道它是否仍然有效.

(测试3.2.9)

更新2

我现在使用ActiveSupport :: Concern代替Observers并after_commit :blah, on: :create在那里工作.

transactions ruby-on-rails observer-pattern ruby-on-rails-3

61
推荐指数
3
解决办法
2万
查看次数

C#:事件或观察者界面?优点缺点?

我有以下(简化):

interface IFindFilesObserver
{
    void OnFoundFile(FileInfo fileInfo);
    void OnFoundDirectory(DirectoryInfo directoryInfo);
}

class FindFiles
{
    IFindFilesObserver _observer;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

......而且我很矛盾.这基本上就是我用C++编写的,但C#有事件.我应该更改代码以使用事件,还是应该不管它?

与传统观察者界面相比,事件的优缺点是什么?

c# events observer-pattern

58
推荐指数
6
解决办法
2万
查看次数

对角度的脏检查

我正在阅读一些文章,以了解更多angular.js的工作原理.

我不理解的一个术语是" 脏检查 ".

究竟是什么?它似乎是一个观察者模式,但显然它更好.

你能帮我理解一下吗?

提前致谢.

编辑:它也可以对谁想要了解更多有关观看的人有用的这段视频swiip在NgEurope一些年前

javascript observer-pattern angularjs

53
推荐指数
3
解决办法
4万
查看次数

NSTextField的文本更改通知

我想使用这个问题答案中的代码: 如何在NSTextField观察NSTextField的值,以便观察存储在NSTextField中的字符串的变化.

[[NSNotificationCenter defaultCenter]
    addObserverForName:NSTextViewDidChangeSelectionNotification
    object:self.textView 
    queue:[NSOperationQueue mainQueue] 
    usingBlock:^(NSNotification *note){
    NSLog(@"Text: %@", self.textView.textStorage.string);
}];
Run Code Online (Sandbox Code Playgroud)

这里使用的类是NSTextView.我在NSTextField中找不到通知而不是使用NSTextViewDidChangeSelectionNotification.

NSTextField中是否有可用于此情况的通知?

cocoa nsnotifications nstextfield observer-pattern

51
推荐指数
3
解决办法
4万
查看次数

如何触发价值变化的功能?

我意识到这个问题与事件处理有关,我已经阅读了关于Python事件处理程序的调度程序,所以要么它没有回答我的问题,要么我完全错过了这些信息.

我想要在值发生变化时触发m()对象的方法:Av

例如(假设钱让人开心):

global_wealth = 0

class Person()
    def __init__(self):
        self.wealth = 0
        global global_wealth
        # here is where attribute should be
        # bound to changes in 'global_wealth'
        self.happiness = bind_to(global_wealth, how_happy)

    def how_happy(self, global_wealth):
        return self.wealth / global_wealth
Run Code Online (Sandbox Code Playgroud)

因此,每当global_wealth更改值时,类的所有实例Person都应相应地更改其happiness值.

注意:我必须编辑问题,因为第一个版本似乎暗示我需要getter和setter方法.对困惑感到抱歉.

python event-handling observer-pattern

48
推荐指数
3
解决办法
6万
查看次数

观察者模式和反应式编程之间有什么区别?

最近我听到了很多关于反应式编程的术语.但是当我搜索它时,我发现的只是观察者模式的一些相似之处.实际上,我发现他们之间没有任何不同.它们之间的概念差异以及为什么反应式编程这个术语会被嗡嗡声?

reactive-programming observer-pattern

45
推荐指数
2
解决办法
9904
查看次数

发布者 - 订阅者与观察者

我试图将Observer设计模式理解为主要事件调度设计模式.观察者模式似乎是发布 - 订阅设计模式的类型或类型,我想知道为什么有两个相似的外观设计模式以及我应该如何在两者之间进行选择.

在这两种情况下,信息消息都在实体之间发送,在这两种情况下,实体必须以某种方式注册或订阅才能接收消息.

两种设计模式之间的主要区别似乎是:

  • 观察者模式似乎具有较低的消息量.观察员向他们观察的实体注册,以获得某一事件的通知.发布 - 订阅模式似乎涉及单向对话,一种从一个实体到另一个实体的独白,具有更多不同类型的消息.
  • 在Observer模式中,Observers期望一种特定类型的事件通知,其中Publish-Subscribe似乎具有更开放的消息协议,具有更广泛的可能消息类型和消息内容(由特定类型的事件触发的消息之间的差异)指示事件发生与更一般的消息协议相对应,消息包含可能不是事件触发器的信息,例如包含由周期性定时器触发的温度数据的消息.
  • Observer在应用程序的边界内或在单个进程内实现.Publish-Subscribe是一种跨应用程序通信模式,消息在不同进程之间交换.
  • 架构的不同之处在于,当Observer使用组合的发布者/代理和订阅者(​​观察者)实体时,Publish-Subscribe具有单独的发布者,代理和订阅者实体.

我想到的一个想法是,在多线程应用程序中,可以在多个线程之间进行通信而不是Observer模式时使用Publish-Subscribe模式.也许Obse​​rver模式可以在进程之间使用,例如进程注册与另一个进程注册,以便在事件发生时得到通知.一个示例是农场管理仪表板应用程序,其注册多个动物饲料箱,如果由箱测量的饲料水平或重量下降到某个阈值以下则通知.

这两种设计模式之间是否存在其他重要差异,这些设计模式可以为选择一种模式提供标准?

design-patterns publish-subscribe event-dispatching observer-pattern

44
推荐指数
0
解决办法
1万
查看次数

Python观察者模式:示例,提示?

是否有在Python中实现的GoF Observer的示例性示例?我有一些代码,当前有一些调试代码通过密钥类(如果设置了魔法env,当前生成消息给stderr).此外,该类还有一个接口,用于递增返回结果以及存储它们(在内存中)以进行后期处理.(该类本身是一个作业管理器,用于通过ssh在远程机器上同时执行命令).

目前该类的用法类似于:

job = SSHJobMan(hostlist, cmd)
job.start()
while not job.done():
    for each in job.poll():
        incrementally_process(job.results[each])
        time.sleep(0.2) # or other more useful work
post_process(job.results)
Run Code Online (Sandbox Code Playgroud)

一个易用的使用模型是:

job = SSHJobMan(hostlist, cmd)
job.wait()  # implicitly performs a start()
process(job.results)
Run Code Online (Sandbox Code Playgroud)

这一切都适用于当前的实用程序.但它确实缺乏灵活性.例如,我目前支持简短的输出格式或进度条作为增量结果,我还支持该post_process()功能的简短,完整和"合并消息"输出.

但是,我想支持多个结果/输出流(到终端的进度条,对日志文件的调试和警告,从成功作业到一个文件/目录的输出,错误消息以及从非成功作业到另一个作业的其他结果)等).

这听起来像是一个需要Observer的情况......我的类的实例接受来自其他对象的注册,并在发生时使用特定类型的事件回调它们.

我正在看PyPubSub,因为我在SO相关问题中看到了几个引用.我不确定我是否已经准备好将外部依赖项添加到我的实用程序中,但是我可以看到使用它们的接口作为我的模型的价值,如果这将使其他人更容易使用它.(该项目既可以作为独立的命令行实用程序,也可以作为编写其他脚本/实用程序的类).

总之,我知道如何做我想要的......但是有很多方法可以实现它.从长远来看,我想知道最有可能为代码的其他用户工作的建议.

代码本身位于:classh.

python design-patterns listener observer-pattern

43
推荐指数
5
解决办法
3万
查看次数

在耙子任务期间关闭观察员的简单方法?

我在我的应用程序中使用restful_authentication.我正在使用rake任务创建一组默认用户,但每次运行任务时都会因为与我的用户模型关联的观察者而发送激活电子邮件.我在创建用户时设置激活字段,因此不需要激活.

任何人都知道在运行rake任务时绕过观察者的简单方法,以便在我保存用户时不会发送电子邮件?

谢谢.

ruby ruby-on-rails restful-authentication observer-pattern

39
推荐指数
4
解决办法
1万
查看次数

为什么要弃用观察者模式?

我注意到我的依赖注入,观察者模式繁重的代码(使用Guava的EventBus)通常比我过去编写的没有这些功能的代码更难调试.特别是在尝试确定调用观察者代码的时间和原因时.

马丁·奥德斯基和朋友们写了一篇冗长的论文,题目是"弃用观察者模式",我还没有花时间阅读它.

我想知道观察者模式的错误是什么,以及更好地引导这些聪明人写这篇论文的(建议的或其他的)替代方案.

首先,我确实在这里找到了一篇(有趣的)论文批评.

oop design-patterns observer-pattern

39
推荐指数
3
解决办法
2万
查看次数