[英]Multiple observable events for one observable
我試圖繞過在解釋 update() 調用時涉及的丑陋條件轉換,該調用將要通知其觀察者多種類型的事件。 另外,我不希望將標志傳遞給 notifyObservers()/update() 方法。
我不希望觀察者必須輪詢可觀察的 object 以找出發生了什么變化,我希望通過 update() 方法(或類似方法)將這些新數據提供給觀察者。
我有一個解決方案的想法。 我為每種類型的通知實例化了一個可觀察的 object。 例如:observable 是一個代表硬件設備的 object,它將包含代表其 state 的 observables:
public final Observable connectionState = new Observable();
public final Observable dataState = new Observable ();
這樣,觀察者不需要進行任何類型的查詢或條件轉換,因為一個觀察者,即每個通知類型可以使用一個覆蓋的 update() 方法。
在經歷了很多挫折之后,這是我能想到的最優雅的解決方案,但是我有一種可怕的感覺,我錯過了如何正確使用 Observers/Observables 的要點。
我對該解決方案的主要問題是:
我在做正確的事嗎?
謝謝
您正在努力解決觀察者模式的 Java 1.0 實現的限制。 看看這個問題的答案java.util.Observable 在任何地方都使用過嗎?
它們沒有被使用,因為它們的設計有缺陷:它們不是類型安全的。 您可以將任何實現 Observer 的 object 附加到任何 Observable,這可能會導致細微的錯誤。
將它們包裝在類型安全的接口中與從頭實現模式的工作量大致相同,所以我猜在大多數情況下后者是首選。
與其試圖將您的需求硬塞到 java.util.Observer 中,不如只實現您自己的模式版本,以更好地滿足您的需求。
您可以嘗試將 Observable 與訪客模式配對使用:
class MyObserver implements Observer, EventVisitor {
public void update(Observable o, Object arg) {
((EventAcceptor) arg).accept(this);
}
public void visit(SomeEvent v) {
System.out.println("SomeEvent: " + v.s);
}
public void visit(AnotherEvent v) {
System.out.println("AnotherEvent: " + v.info);
}
}
interface EventVisitor {
void visit(SomeEvent v);
void visit(AnotherEvent v);
}
interface EventAcceptor {
void accept(EventVisitor v);
}
class SomeEvent implements EventAcceptor {
public final String s;
public SomeEvent(String s) {
this.s = s;
}
public void accept(EventVisitor v) {
v.visit(this);
}
}
class AnotherEvent implements EventAcceptor {
public final String info;
public AnotherEvent(String info) {
this.info = info;
}
public void accept(EventVisitor v) {
v.visit(this);
}
}
class MyObservable extends Observable {
void handleSomeEvent() {
setChanged();
notifyObservers(new SomeEvent("some event"));
}
void handleAnotherEvent() {
setChanged();
notifyObservers(new AnotherEvent("some event"));
}
}
class Sample {
public static void main(String[] args) {
MyObservable observable = new MyObservable();
observable.addObserver(new MyObserver());
observable.handleSomeEvent();
observable.handleAnotherEvent();
}
}
您的問題有很多可能的解決方案。 如果您覺得 Observable class 不適合您的問題,您可以維護自己的偵聽器集合。
interface Listener {
void onEvent1(Type1 arg);
void onEvent2(Type2 t2, Type3 t3);
void onEvent3();
}
List<Listener> listeners = new CopyOnWriteArray<Listener>();
public void addListener(Listener l) { listeners.add(l); }
public void onEvent1(Type1 arg) {
for(Listener l: listeners) l.onEvent1(arg);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.