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

时间:2011-06-29 12:33:10

标签: java events observer-pattern

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

感谢。

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

我认为观察者模式的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);
}

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

这种方法有以下好处:

  1. 您可以灵活添加更多类型的活动 而不影响代码 观察者。
  2. 您可以注册任何观察者 事件。
  3. 您更新只是观察员     那些有效地感兴趣     每个活动。
  4. 您可以避免“空方法”,“事件类型检查”等 观察员方面的技巧

答案 2 :(得分:3)

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

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);

答案 3 :(得分:0)

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

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

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