簡體   English   中英

一個 observable 的多個 observable 事件

[英]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 的要點。

我對該解決方案的主要問題是:

  1. 它仍然涉及演員(至少它不是有條件的)
  2. 由於可觀察對象需要是可觀察的,因此它們必須是公共成員。 雖然這確實允許觀察者調用 addObservable(),但它也允許他們調用 notifyObservers()。

我在做正確的事嗎?

謝謝

您正在努力解決觀察者模式的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM