标签: observer-pattern

委托:Angular中的EventEmitter或Observable

我试图在Angular中实现类似委托模式的东西.当用户点击a时nav-item,我想调用一个函数然后发出一个事件,而该事件又由一些其他组件监听事件来处理.

这是场景:我有一个Navigation组件:

import {Component, Output, EventEmitter} from 'angular2/core';

@Component({
    // other properties left out for brevity
    events : ['navchange'], 
    template:`
      <div class="nav-item" (click)="selectedNavItem(1)"></div>
    `
})

export class Navigation {

    @Output() navchange: EventEmitter<number> = new EventEmitter();

    selectedNavItem(item: number) {
        console.log('selected nav item ' + item);
        this.navchange.emit(item)
    }

}
Run Code Online (Sandbox Code Playgroud)

这是观察组件:

export class ObservingComponent {

  // How do I observe the event ? 
  // <----------Observe/Register Event ?-------->

  public selectedNavItem(item: number) {
    console.log('item index changed!');
  }

}
Run Code Online (Sandbox Code Playgroud)

关键问题是,如何让观察组件观察相关事件?

event-delegation observable observer-pattern eventemitter angular

231
推荐指数
2
解决办法
12万
查看次数

我们什么时候应该使用Observer和Observable?

一位采访者问我:

什么是ObserverObservable我们何时应该使用它们?

我不知道这些术语的,所以,当我回到家,开始对谷歌搜索ObserverObservable,我发现来自不同资源的一些要点:

1)Observable是一个类,Observer是一个接口.

2)Observable该类维护一个Observers 列表.

3)当一个Observable对象被更新时,它会调用update()每个Observers 的方法来通知它,它被改变了.

我找到了这个例子:

import java.util.Observable;
import java.util.Observer;

class MessageBoard extends Observable
{
    public void changeMessage(String message) 
    {
        setChanged();
        notifyObservers(message);
    }
}

class Student implements Observer 
{
    @Override
    public void update(Observable o, Object arg) 
    {
        System.out.println("Message board changed: " + arg);
    }
}

public class MessageBoardTest 
{
    public static void main(String[] args) 
    { …
Run Code Online (Sandbox Code Playgroud)

java design-patterns observers observable observer-pattern

191
推荐指数
7
解决办法
14万
查看次数

Observer,Pub/Sub和Data Binding之间的区别

观察者模式,发布/订阅数据绑定有什么区别?

我在Stack Overflow上搜索了一下,没有找到任何好的答案.

我所相信的是,数据绑定是一个通用术语,有不同的实现方式,如观察者模式或发布/子模式.使用Observer模式,Observable更新其观察者.使用Pub/Sub,0-many发布者可以发布某些类的消息,0-many订阅者可以订阅某些类的消息.

是否有其他实施"数据绑定"的模式?

data-binding model-view-controller design-patterns publish-subscribe observer-pattern

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

确定Rails after_save回调中哪些属性发生了变化?

我正在我的模型观察器中设置一个after_save回调,只有当模型的已发布属性从false更改为true 时才发送通知.既然方法改变了?只有在保存模型之前才有用,我目前(并且未成功)尝试这样做的方式如下:

def before_save(blog)
  @og_published = blog.published?
end

def after_save(blog)
  if @og_published == false and blog.published? == true
    Notification.send(...)
  end
end
Run Code Online (Sandbox Code Playgroud)

有没有人对处理这个问题的最佳方法有任何建议,最好使用模型观察者回调(以免污染我的控制器代码)?

model ruby-on-rails callback observer-pattern ruby-on-rails-4

138
推荐指数
6
解决办法
9万
查看次数

带代理的C#observer/observable的超简单示例

我最近开始深入研究C#,但我不能通过我的生活弄清楚委托在语言中实现观察者/可观察模式时的工作方式.

有人能给我一个超级简单的例子说明它是如何完成的吗?我谷歌搜索了这个,但我发现的所有例子都是特定于问题或过于"臃肿".

c# events delegates observer-pattern

131
推荐指数
5
解决办法
13万
查看次数

观察者设计模式与"听众"

在我看来,GOF中描述的Observer设计模式与Listeners在各种工具包中找到的实际上是相同的.概念之间是否存在差异,或者听众和观察者是否真的相同.

(我不是在寻找任何特定的计算机语言实现,我只是想从设计的角度来理解差异(如果有的话).是的,我知道有关SOF的类似问题有几个答案,但它们已根深蒂固关于特定语言的具体问题 - 我正在寻找设计答案,而不是语言答案.)

language-agnostic design-patterns listener observer-pattern

128
推荐指数
2
解决办法
5万
查看次数

在Java 9中不推荐使用Observer.我们应该使用什么而不是它?

Java 9问世,Observer已被弃用.这是为什么?这是否意味着我们不应该再实施观察者模式了?

知道什么是更好的选择会很好吗?

java deprecated observer-pattern java-8 java-9

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

Mediator Vs Observer面向对象的设计模式

我一直在阅读四人帮,以解决我的一些问题,并遇到了Mediator模式.

我之前在项目中使用了Observer来制作一些GUI应用程序.我有点困惑,因为我发现两者之间没有太大区别.我浏览找到差异,但找不到任何适合我的查询的答案.

有人可以帮助我区分两者,并用一些明确划分两者的好例子吗?

oop design-patterns mediator observer-pattern

84
推荐指数
7
解决办法
3万
查看次数

听众作为弱点的利弊

将听众保持为WeakReferences的利弊是什么.

当然,最大的'专业'是:

将侦听器添加为WeakReference意味着侦听器不需要打扰"删除"自身.

更新

对于那些担心只有对象引用的侦听器,为什么有2个方法,addListener()和addWeakRefListener()?

那些不关心去除的人可以使用后者.

java design-patterns weak-references observer-pattern

70
推荐指数
5
解决办法
2万
查看次数

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万
查看次数