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



我有一个类MyObserver,它监听Notifier中的更改。Notifier扩展Observable并使用notifyObserver(Object(通知其事件。作为参数传递的对象始终是同一类的实例。问题是,每个观察者都需要倾听不同的事件。例如,一个观测者需要监听状态更改的事件,而另一个则需要监听所有类型的事件。如何使用观察者模式来完成此操作?

谢谢。

使用notifyObserver(Object arg(版本并创建某种"事件类型"对象以固定在其中。在您的观察类中,只需过滤传入的事件类。

public void update(Object observable, Object arg) {
    if ( (MyEvent) arg.isEventX() ) { /* do stuff */ }
}

我认为观察者模式的Java内置实现不适合您的情况。

事实上,当只出现一种可观察的事件时,一般的观察者模式是可用的。在观察者设计模式中,所有观察者总是得到通知。

因此,在这种情况下,您需要通过定义自己的Observable接口来扩展通用Observer模式,例如:

public enum EventKind {
   EVENT_A, EVENT_B, EVENT_C;
}
public interface Observable {
   public void registerObserver(EventKind eventKind);
   public void unregisterObserver(EventKind eventKind);
   public void notifyObservers(EventKind eventKind);
}

然后,您可以使用每种要通知的事件的内部列表来实现这个Observable接口。如果您愿意,您仍然可以使用Java内置的Observer接口。

这种方法有以下好处:

  1. 您可以灵活地添加更多类型的事件而不影响观察员
  2. 您可以将任何观察员注册到事件
  3. 您只更新观察者对其感兴趣每个事件
  4. 您可以避免"空方法"、"事件类型检查"和其他观察员方面的技巧

如果你能稍微改变一下设计:

interface MyObserver {
    public void stateChangeEvent();
    public void otherEvent();
}
class MyObserverAdapter implements MyObserver {
    public void stateChangeEvent() {
         // some default implementation or no implementation.
    }
    public void otherEvent() {
         // some default implementation or no implementation.
    }
}
class MyStateChangeObserver extends MyObserverAdapter {
    public void stateChangeEvent() {
         // implement behavior specific to this class.
    }
}
class MyOtherObserver extends MyObserverAdapter {
    public void otherEvent() {
         // implement behavior specific to this class.
    }
}

用法:

MyObserver stateObserver = new MyStateChangeObserver();
MyObserver otherObserver = new MyOtherObserver();
notifier.notifyObservers(stateObserver);
notifier.notifyObservers(otherObserver);

您可以通过在Observable类中执行以下操作来测试状态更改:

public void update(Observable o, Object arg)
{
    if(o.hasChanged())
    {
        // do something
    }
}

听任何东西的观察者都不需要这个测试。如果您只想监听状态变化,这可能是最简单的方法。

最新更新