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

Java 具有两个观察者列表的观察者模式,java,events,observer-pattern,Java,Events,Observer Pattern,我有一个类MyObserver,它监听通知程序中的更改。通知程序扩展了Observable并使用notifyObservers(对象)通知其事件。作为参数传递的对象始终是同一类的实例。问题是每个观察者都需要倾听不同的事件。例如,一个观察者需要监听状态改变的事件,而其他观察者需要监听所有类型的事件。我如何使用观察者模式实现这一点 谢谢。使用version并创建某种类型的“事件类型”对象以粘贴在其中。在观察类中,只需对传入的事件类进行筛选 public void update(Object obse

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

谢谢。

使用version并创建某种类型的“事件类型”对象以粘贴在其中。在观察类中,只需对传入的事件类进行筛选

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

如果您可以稍微更改一下设计:

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
    }
}

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

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

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

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

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);
}
然后,您就可以实现这个可观察的接口,为每种要通知的事件提供内部列表。如果愿意,您仍然可以使用Java内置的Observer接口

这种方法有以下好处:

  • 您可以灵活地添加更多种类的事件 在不影响 观察员
  • 您可以将任何观察者注册到任何 事件
  • 您只需更新观察员即可 实际上对感兴趣的 每个事件
  • 您可以避免“空方法”、“事件类型检查”和其他方法 观察者方面的把戏

  • 当你说你可以观察到。你是说你实现了你自己的可观察接口还是从java.util.Observable扩展而来?你到底面临什么问题?我实现了java.util.Observable.噢,是的,是我的错。我的意思是可以观察到的。谢谢,很好。没有默认实现,因此我支持删除MyObserverAdapter。但是,如果我删除它,怎么可能只听一个事件而不听所有事件?也许我需要适配器类。@David适配器可能仍然有用,因为您只需要在其他两个类中实现所需的方法。我不太理解您的用法示例。主类(observer)是否必须实现MyStateChangeObserver?这有一个问题,即如果添加新类型的事件,则必须修改接口MyObserver和每个实现者,因此不是一种非常“开放扩展”的方法。我指的是一个关于事件类的小示例,但感谢您的示例。