【问题标题】:Observer pattern with two lists of observers具有两个观察者列表的观察者模式
【发布时间】:2011-06-29 12:33:09
【问题描述】:

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

谢谢。

【问题讨论】:

  • 当你说实现 Observable 时。你的意思是实现自己的 Observable 接口还是从 java.util.Observable 扩展?
  • 您面临的具体问题是什么?
  • 我实现了 java.util.Observable。
  • 哦,是的,我的错。我的意思是扩展 Observable。谢谢。

标签: java events observer-pattern


【解决方案1】:

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

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

【讨论】:

  • 我的意思是一个关于事件类的小例子,但谢谢你的例子。
【解决方案2】:

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

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

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

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. 您避免“空方法”、“事件类型检查”等 观察者方面的技巧

【讨论】:

    【解决方案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);
    

    【讨论】:

    • 不错。没有默认实现,所以我想我可以删除 MyObserverAdapter。但是,如果我删除它,怎么能只听一个事件而不听所有?也许我需要适配器类。
    • @David 适配器可能仍然有用,因为您只需要在其他两个类中实现所需的方法。
    • 我不太了解您的使用示例。主类(观察者)是否必须实现 MyStateChangeObserver?
    • 这有一个问题,如果你添加新类型的事件,你将不得不修改接口 MyObserver 和每个实现者,所以不是一个非常“开放扩展”的方法。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 2018-10-15
      • 2012-07-09
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多