我有一个MyObserver类,用于侦听通告程序中的更改。Notifier扩展了Observable并用notifyObservers(Object)通知它的事件。作为参数传递的对象始终是同一类的实例。问题是每个观察者需要监听不同的事件。例如,一个观察者需要监听状态改变的事件,而其他观察者需要监听所有类型的事件。我如何使用观察者模式来做到这一点呢?
谢谢。
发布于 2011-06-29 20:46:41
如果您可以稍微更改一下设计:
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);
发布于 2011-06-29 20:40:32
使用notifyObservers(Object arg)版本并创建某种“事件类型”对象来固定在其中。在观察类中,只需对传入的事件类进行过滤即可。
public void update(Object observable, Object arg) {
if ( (MyEvent) arg.isEventX() ) { /* do stuff */ }
}
发布于 2011-06-29 21:15:09
我认为观察者模式的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);
}
然后,您可以只实现这个Observable接口,并为每种要通知的事件提供内部列表。如果愿意,您仍然可以使用Java内置的观察者接口。
这种方法有以下优点:
在不影响Observers.
<>G222>
https://stackoverflow.com/questions/6520673
复制相似问题