标签: observer-pattern

我是否应该在Java bean中为Web应用程序添加对PropertyChangeSupport和PropertyChangeListener的支持?

我注意到有些人写bean支持Property Change观察者模式.

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;

public class SampleBean implements Serializable {
    public static final String PROP_SAMPLE_PROPERTY = "sampleProperty";
    private String sampleProperty;
    private PropertyChangeSupport propertySupport;

    public ChartBean() {
        propertySupport = new PropertyChangeSupport(this);
    }

    public String getSampleProperty() {
        return sampleProperty;
    }

    public void setSampleProperty(String value) {
        String oldValue = sampleProperty;
        sampleProperty = value;
        propertySupport.firePropertyChange(PROP_SAMPLE_PROPERTY, oldValue, sampleProperty);
    }


    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertySupport.removePropertyChangeListener(listener);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我记得由于Web应用程序的无状态特性,观察者模式并不常用于基于Web的MVC模式.

Web应用程序 Java bean中遵循上述模式是一种好习惯吗?

java web-applications javabeans observer-pattern

9
推荐指数
1
解决办法
7355
查看次数

java.util.Observable是线程安全的吗?

在java的Observer模式类ObserverObservable中,调用Observable对象的notifyObservers(Object arg0),在不同的线程中,线程安全吗?

示例:我有多个线程,所有Observable,将经常调用notifyObservers(...).所有这些线程都报告给一个Observer对象.

我是否会遇到并发问题,以及解决这个问题的更好方法是什么?我知道使用事件侦听器的可能解决方案.但是我不确定如何实现它,如果可能的话,我想坚持使用Observer模式实现.

java thread-safety observer-pattern

9
推荐指数
1
解决办法
6786
查看次数

观察者在购物车中删除了物品

是否有观察员可以用来观察产品从购物车中取出时的事件?我还没找到.

我发现checkout_cart_update_items_after如果通过改变产品数量来移除产品,可以使用哪些产品,但是当用户使用移除按钮时则不能使用.我现在看到的唯一选择checkout_cart_save_after是每当推车改变时使用.当然,这需要定制逻辑来检查哪个产品被删除.不完美.

那么是否有更好的方法来注意删除事件?

magento observer-pattern

9
推荐指数
1
解决办法
7655
查看次数

是否应该在每个单独的线程中通知观察者?

我知道这听起来很重,但我正试图解决一个假设的情况.想象一下,你有一些物体的N个观察者.每个人都对对象状态感兴趣.应用Observer模式时,可观察对象倾向于迭代调用observer notify()|update()方法的观察者列表.

现在想象一下,特定的观察者有很多与可观察对象的状态有关的工作.例如,这会减慢上一次通知的速度.

因此,为了避免减慢对所有观察者的通知,我们可以做的一件事是在一个单独的线程中通知观察者.为了实现这一点,我想每个观察者都需要一个线程.这是一个痛苦的开销,我们正在努力避免因繁重工作导致的通知减慢.如果使用线程方法,最慢的是减速,是由无限循环引起的死线程.阅读这本有经验的程序员会很棒.

  • 有多年设计问题的人会怎么想?
  • 这是一个没有财务解决方案的问题吗?
  • 这是一个非常糟糕的主意吗?为什么?

这是一个模糊的例子,以展示并希望澄清我甚至没有测试的基本思想:

class Observable(object):
    def __init__(self):
        self.queues = {}

    def addObserver(self, observer):
        if not observer in self.queues:
            self.queues[observer] = Queue()
            ot = ObserverThread(observer, self.queues[observer])
            ot.start()

    def removeObserver(self, observer):
        if observer in self.queues:
            self.queues[observer].put('die')
            del self.queues[observer]

    def notifyObservers(self, state):
        for queue in self.queues.values():
            queue.put(state)

class ObserverThread(Thread):
    def __init__(self, observer, queue):
        self.observer = observer
        self.queue = queue

    def run(self):
        running = True
        while running:
            state = …
Run Code Online (Sandbox Code Playgroud)

multithreading observer-pattern

9
推荐指数
1
解决办法
2571
查看次数

为什么信号和插槽比普通的旧回调更好?

这里有新手到C++.我正在阅读更深入的信号和插槽,它声称1)回调本质上是类型不安全的,2)为了使它们安全,你需要在你的函数周围定义一个纯虚拟类包装器.我很难理解为什么这是真的.作为一个例子,这里是Qt在其教程页面上提供的信号和插槽的代码:

// Header file
#include <QObject>

class Counter : public QObject
{
    Q_OBJECT

public:
    Counter() { m_value = 0; }

    int value() const { return m_value; }

public slots:
    void setValue(int value);

signals:
    void valueChanged(int newValue);

private:
    int m_value;
};

// .cpp file
void Counter::setValue(int value)
{
    if (value != m_value) {
        m_value = value;
        emit valueChanged(value);
    }
}

// Later on...
Counter a, b;
QObject::connect(&a, SIGNAL(valueChanged(int)),
                 &b, SLOT(setValue(int)));

a.setValue(12);     // a.value() == 12, b.value() == …
Run Code Online (Sandbox Code Playgroud)

c++ events qt signals-slots observer-pattern

9
推荐指数
2
解决办法
4476
查看次数

问题实施观察者模式:"成员参考基础类型________不是结构或联合"

我一直在实现一个准确的观察者模式,并且陷入了一个有点神秘的错误:"成员引用基类型'Observer*'不是结构或联合".我认为这与我使用模板有关,我仍然相当不舒服.这是有问题的代码(为了简化事情,删除了大多数缺点/析构函数):

主题界面:

class Subject { 
public:
    virtual void notify();
private:
    list< Observer * > m_observers; 
};
Run Code Online (Sandbox Code Playgroud)

主题实施:

void Subject::notify() {
    list< Observer * >::iterator i;

    for ( i = m_observers.begin(); i != m_observers.end(); i++ ) {
        *i->update( this );                        // ERROR !!! ERROR
}
Run Code Online (Sandbox Code Playgroud)

观察者抽象界面:

class Observer {
public:
    virtual ~Observer();
    virtual void update( Subject * changedSubject ) = 0;

protected:
    Observer();
};
Run Code Online (Sandbox Code Playgroud)

具体观察者界面:

class ConcreteObserver: public Observer {

public:
    ConcreteObserver( ConcreteSubject * );
    virtual ~ConcreteObserver();

    virtual void update( Subject …
Run Code Online (Sandbox Code Playgroud)

c++ templates iterator list observer-pattern

8
推荐指数
1
解决办法
7631
查看次数

观察者模式抽象与界面

我有观察者模式的问题.它说Observer和Subject都应该是接口.我明白为什么观察者是接口,但为什么将主题作为抽象类更好呢?难道你不能实现至少删除/注册?

design-patterns observer-pattern

8
推荐指数
2
解决办法
2024
查看次数

Observable/Observer不工作?

我尝试在我的Application子类中实现静态Observable,但它不起作用.没有异常或错误消息,但我的update()回调没有被调用.

MyApplication.java

public class MyApplication extends Application{
    public static Observable appObserver = new Observable();

    public void onCreate(){
        super.onCreate();        
    }

}
Run Code Online (Sandbox Code Playgroud)

Foo.java

MyApplication.appObserver.notifyObservers( "Hello world" );
Run Code Online (Sandbox Code Playgroud)

BarFragment.java

public class BarFragment extends Fragment implements Observer{

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);                
        MyApplication.appObserver.addObserver(this);
    }


    @Override
    public void onDestroy() {       
        MyApplication.appObserver.deleteObserver(this);
        super.onDestroy();
    }


    @Override
    public void update(Observable observable, Object data) {
        Log.i("BarFragment", data.toString()); // Should log, but doesn't
    }

}
Run Code Online (Sandbox Code Playgroud)

更重要的是,我试着涂鸦了一个简单的可观察我自己的,然后一切工作就像一个魅力与刚刚替换public static Observable appObserver = new Observable();public static MyObservable appObserver …

java android observers observable observer-pattern

8
推荐指数
2
解决办法
7050
查看次数

是否可以监视列表成员(或可变序列)何时修改列表成员?

假设我有一个非常简单的数据类型:

class SimpleObject:
    def __init__(self, property):
        self.property = property

    def update_property(self, value):
        self.property = value
Run Code Online (Sandbox Code Playgroud)

我是一种特殊的列表来存储数据类型:

class SimpleList(collections.MutableSequence):
    def update_useful_property_of_list(self, value):
        self.useful_property_of_list = value
Run Code Online (Sandbox Code Playgroud)

我存储它们:

simple1 = SimpleObject(1)
simple2 = SimpleObject(2)

simple_list = SimpleList([simple1, simple2])
Run Code Online (Sandbox Code Playgroud)

有没有办法让SimpleList对象知道其成员的某个属性何时发生变化?例如,当这样的事情发生时,我怎样才能simple_list执行self.update_useful_property_of_list():

simple1.update_property(3)
Run Code Online (Sandbox Code Playgroud)

python list mutable sequence observer-pattern

8
推荐指数
1
解决办法
176
查看次数

Rxjs完成后主题next()()

我有连接的服务Subject()做分页.我正在使用next(newData)传递给主题,这让事情保持活力,现在我需要complete()在每个ajax调用上使用并将其传递给主题.但在做了一个之后,complete()我开始得到错误.

我想知道,如果一旦被触发,我们仍然可以传递Subject可观察量吗?next(newData)completed()

javascript observable observer-pattern rxjs rxjs5

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