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

Dav*_*cía 4 java events observer-pattern

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

谢谢.

And*_*ite 5

使用notifyObservers(Object arg)版本并创建某种"事件类型"对象以留在那里.在您的观察类中,只需过滤传入的事件类.

public void update(Object observable, Object arg) {
    if ( (MyEvent) arg.isEventX() ) { /* do stuff */ }
}
Run Code Online (Sandbox Code Playgroud)


Mr.*_*art 5

我认为Observer Pattern的Java内置实现不适合您的情况.

实际上,只有一种Observable事件可以出现时,一般的Observer模式才可用.在观察者设计模式中,所有观察者始终得到通知.

因此,在这种情况下,您需要通过定义自己的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);
}
Run Code Online (Sandbox Code Playgroud)

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

这种方法有以下好处:

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