标签: observer-pattern

在观察者中停止产品保存过程

我目前正在开发一个在后端使用产品编辑的模块.其目的是检索产品所属的类别,并使用所选类别列表填充属性(Brand属性).

管理员必须至少选择一个类别.

我的模块按预期工作,但如果管理员在编辑产品时没有选择任何类别,我不知道如何停止保存过程.

这是工作流程

  • 管理员在产品编辑页面的类别选项卡中选择类别
  • 管理员点击"保存"
  • 我的模块"观察"并收集所有类别

- >如果有选定的类别

  • 我的模块的观察者做了更新Brand属性的东西

- >其他

  • 我的模块的观察者向管理会话添加了一个错误
  • 我的模块的观察者应告诉Magento停止保存产品.但是我该怎么做?

通用问题可能是:如何将"停止保存"参数传递给观察者?

以下是我的config.xml文件示例以及处理我上面解释的工作流程的方法.

非常感谢您的帮助,并享受Magentoing的乐趣!

config.xml中

    <catalog_product_prepare_save>
        <observers>
            <brands_product_save_observer>
                <type>singleton</type>
                <class>brands/observer</class>
                <method>saveProductBrand</method>
            </brands_product_save_observer>
        </observers>
    </catalog_product_prepare_save>
Run Code Online (Sandbox Code Playgroud)

Observer.php

public function saveProductBrand($observer) {
    $product = $observer->getProduct();
    $categoryIds = $product->getCategoryIds();
    if (isset($categoryIds)) {
        foreach ($categoryIds as $categoryId) {
            $isBrandCategory = Mage::getModel('brands/navigation')->isBrandCategory($categoryId);
            if ($isBrandCategory)
                $brandCategories[] = $categoryId;
        }
        if (isset($brandCategories)) {
            $brandId = Mage::getModel('brands/navigation')->getBrand($brandCategories[0]);
            if ($brandId) {
                $attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 140);
                foreach ($attribute->getSource()->getAllOptions(true, true) as $option) {
                    $attributeArray[$option['label']] = $option['value'];
                }
                $categoryName = …
Run Code Online (Sandbox Code Playgroud)

php save magento abort observer-pattern

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

具有两个观察者列表的观察者模式

我有一个MyObserver类,它监听Notifier中的更改.Notifier扩展了Observable并使用notifyObservers(Object)通知其事件.作为参数传递的对象始终是同一个类的实例.问题是每个观察者都需要听取不同的事件.例如,一个观察者需要监听状态改变的事件,而其他观察者需要监听所有类型的事件.我怎样才能用观察者模式做到这一点?

谢谢.

java events observer-pattern

4
推荐指数
2
解决办法
3696
查看次数

当观察者的寿命超过观察者时,何时以及由谁来分离观察者

我使用公司中不同组提供的第三方库(用C++编写)遇到了这个问题.

在Observer的析构函数中,它将自己从它所订阅的所有可观察对象中分离出来,这部分对我来说是有意义的.但是在Observable的析构函数中,它会检查observable是否有任何仍然在其订阅者列表中的观察者.如果是这样,则抛出错误.

我要说的是它故意在析构函数中抛出一个错误.有人可以试着向我解释为什么观察者应该期望没有观察者比自己活得更久,或者这只是一个糟糕的设计.如果这是一个糟糕的设计,当我们处于观察者超过观察者的情况下,是否有好的方法来处理它?

c++ observable observer-pattern

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

观察者可以安全地用Rx监听多个可观测量吗?

我试图看看如何使用Rx将多个可观察事件流式传输到一组事件中.但是当我运行下面的代码时,我得到一个例外.那么这是否意味着由于违反Rx语法,多个观察者总是容易出现异常?我的意思是如果这些多个观察者中的两个偶然同时生成一个事件(任何两个可观察者将同时产生一些概率),它应该给出一个例外.

DateTimeOffset start;
        object sync = new object();
        var subject = new Subject<long>();
        var observer = Observer.Create<long>(c =>
        {
            lock (sync)
            {
                Console.WriteLine(c);
            }
        })
            ;

        var observable1 = Observable.Interval(TimeSpan.FromSeconds(2));
        var observable2 = Observable.Interval(TimeSpan.FromSeconds(5));
        var observable3 = Observable.Never<long>().Timeout
            (start = DateTimeOffset.Now.AddSeconds(15),
             (new long[] { 1 }).ToObservable());
        var observable4 = Observable.Never<long>().Timeout(start);
        observable1.Subscribe(observer);
        observable2.Subscribe(observer);
        observable3.Subscribe(observer);
        observable4.Subscribe(observer);
        Thread.Sleep(20000);
Run Code Online (Sandbox Code Playgroud)

感谢Gideon的解释.这是我得到的例外.你是对的,这是一个时间的例子.这是一个编码错误.谢谢.

System.TimeoutException: The operation has timed out.
   at System.Reactive.Observer.<Create>b__8[T](Exception e)
   at System.Reactive.AnonymousObserver`1.Error(Exception exception)
   at System.Reactive.AbstractObserver`1.OnError(Exception error)
   at System.Reactive.Subjects.Subject`1.OnError(Exception error)
   at System.Reactive.AnonymousObservable`1.AutoDetachObserver.Error(Exception e
xception)
   at System.Reactive.AbstractObserver`1.OnError(Exception …
Run Code Online (Sandbox Code Playgroud)

c# system.reactive observable observer-pattern

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

Java:新线程中的observer-pattern通知

我有以下问题.给定观察者模式的接口EventNotifier:

public interface EventNotifier {
    void newEvent(final String value);
}
Run Code Online (Sandbox Code Playgroud)

实现此接口的类可以在另一个类中注册,该类通常调用newEvent方法.接口由外部库提供,因此我无法更改它.到目前为止,我使用匿名类实现了它:

Thread t = new Thread(new Runnable() {

    @Override    
    public void run() {

      watcher = new Watcher(new EventNotifier() {

          @Override
          public void newEvent(String value) {
              //do some stuff
              //will be called more than 20 times per second
          }
       });
 });
 t.start();
Run Code Online (Sandbox Code Playgroud)

为了更好的代码可读性,我想将这个匿名类暴露给一个新类,它扩展了Thread(因为处理应该与其他东西并行).

如何编写一个Thread,它什么都不做(没有无限循环等),但是等待调用newEvent方法?问题是,newEvent每秒会调用超过20次,所以我无法为每个调用启动一个新线程,但整个事情应该在一个线程中.

我希望你能解决问题,有人可以帮助我.

java multithreading observer-pattern

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

在Cocoa中添加一个进程的观察者

我正在为iTunes开发一种插件.

许多用户已经请求,如果他们启动iTunes,他们想要启动插件,这当然是有意义的.但是,我不知道该怎么做.

我想到了一个帮助应用程序,这可能是唯一的方法.唯一困扰我的是如何获得通知.当然,我可以不断检查iTunes是否正在运行,但我不确定这是否是正确的方法.

我宁愿添加我的应用程序作为该过程的观察者.那可能吗?

如果没有,Activity Monitor如何做到这一点?


感谢Daij-Djan!我得到它像这样工作:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
                                                           selector:@selector(iTunesLaunched:)
                                                               name:NSWorkspaceDidLaunchApplicationNotification
                                                             object:nil];

    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
                                                           selector:@selector(iTunesTerminated:)
                                                               name:NSWorkspaceDidTerminateApplicationNotification
                                                             object:nil];
}

-(void) iTunesLaunched:(NSNotification *)notification {
    NSRunningApplication *runApp = [[notification userInfo] valueForKey:@"NSWorkspaceApplicationKey"];
    if ([runApp.bundleIdentifier isEqualToString:@"com.apple.iTunes"])
        NSLog(@"start");

}

-(void) iTunesTerminated:(NSNotification *)notification {
    NSRunningApplication *runApp = [[notification userInfo] valueForKey:@"NSWorkspaceApplicationKey"];
    if ([runApp.bundleIdentifier isEqualToString:@"com.apple.iTunes"])
        NSLog(@"terminate");

}
Run Code Online (Sandbox Code Playgroud)

macos cocoa itunes objective-c observer-pattern

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

用事件实现观察者模式

我正在开发一个Silverlight应用程序,我过度使用了观察者模式.在我的实现中,我创建了两个接口IObservable<T>IObserver<T>.前者包含将观察者附加到观察者的方法.后者有一个方法Notify(IObservable<T> observable, ...),observer.Notify(this, ...)当observable改变了状态时,observable 将自身作为参数传递.

现在我偶然发现了"事件",对我来说,似乎这就是观察者模式的一个实现,只是代表而不是前面提到的Notify方法.是对的吗?

我不太了解代表,并且不想花费数小时来重写我的代码只是为了最终得到与它已经做同样事情的代码.另一方面,事件可能优于基于接口的观察者模式.我错过了什么吗?

c# events observer-pattern

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

观察者模式强制势在必行的风格

我在看Coursera中的Reactive Programming课程,它使用Scala实现Observer模式.在那里,Martin Odersky说观察者模式迫使命令式编程,我们可以看到,因为订阅者的处理程序有Unit类型.

他在这里说:https: //class.coursera.org/reactive-002/lecture/107 9:40

我真的不明白:

1.为什么处理者需要有Unit类型?

2. Observer模式如何强制命令式编程?

functional-programming scala imperative-programming observer-pattern

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

在python中实现观察者模式的替代方法

我正想通过后有关如何观察者模式可以在Python中实现.在同一篇文章中有这些评论.

1)在python中你也可以只使用普通函数,"观察者"类并不是真正需要的.

2)这是Java程序员在切换到Python后尝试做的很好的例子 - 他们觉得Python缺少所有垃圾并尝试"移植"它.

这些注释暗示观察者模式在python中并不真正有用,并且存在其他方法来实现相同的效果.这是真的,如果能做到这一点?

这是观察者模式的代码:

class Observable(object):

    def __init__(self):
        self.observers = []

    def register(self, observer):
        if not observer in self.observers:
            self.observers.append(observer)

    def unregister(self, observer):
        if observer in self.observers:
            self.observers.remove(observer)

    def unregister_all(self):
        if self.observers:
            del self.observers[:]

    def update_observers(self, *args, **kwargs):
        for observer in self.observers:
            observer.update(*args, **kwargs)

from abc import ABCMeta, abstractmethod

class Observer(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def update(self, *args, **kwargs):
        pass

class AmericanStockMarket(Observer):
    def update(self, *args, **kwargs):
        print("American stock market received: {0}\n{1}".format(args, kwargs))

class EuropeanStockMarket(Observer):
    def …
Run Code Online (Sandbox Code Playgroud)

python first-class-functions observer-pattern

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

将信号连接到插槽,但只调用一次插槽,然后自动断开它们的连接

考虑以下JS代码:

function handleSig() {
    emitter.someSig.disconnect(handleSig);
    // do some work here
}

emitter.someSig.connect(handleSig);
Run Code Online (Sandbox Code Playgroud)

是否可以在没有显式断开连接和命名函数的情况下进行编写?

理想情况下,我想要这样的东西:

emitter.someSig.connect(
    function() {
        // do some work here
    },
    Qt.SingleShotConnection
);
Run Code Online (Sandbox Code Playgroud)

几乎重复:第一次发出信号后自动断开连接 -但是这个问题与Python有关,而我的问题与QML和C ++有关。

qt signals-slots qml observer-pattern qtquick2

4
推荐指数
2
解决办法
2243
查看次数