簡體   English   中英

在java中避免使用instanceof運算符時觀察多個observable?

[英]Observing multiple observables while avoiding instanceof operator in java?

如果我有一個對象,我希望能夠觀察其他幾個可觀察對象,而不是所有相同的類型。 例如,我希望A能夠觀察B和C.B和C完全不相關,除了它們都實現了Observable。

顯而易見的解決方案是在更新方法中使用“if instanceof”,但很快就會變得混亂,因此我想知道是否還有其他方法?

一個干凈的解決方案是在A使用(匿名)內部類來充當Observer 例如:

class A {
    public A(B b, C c) {
        b.addObserver(new BObserver());
        c.addObserver(new CObserver());
    }

    private class BObserver implements Observer {
        // Logic for updates on B in update method
    }

    private class CObserver implements Observer {
        // Logic for updates on C in update method
    }
}

這將允許您將BObserver / CObserver實例添加到您實際想要觀看的許多BC 它的A好處是A的公共界面不那么雜亂,您可以輕松添加新的內部類來處理DEF

與之前的建議類似,您可以將更改更改為。

public void update(Observable o, Object arg) {
  try{
    Method update = getClass().getMethod(o.getClass(), Object.class);
    update.invoke(this, o, arg);
  } catch(Exception e) {
    // log exception
  }
}

這樣您就可以添加一個方法

public void update(A a, Object arg);
public void update(B b, Object arg);
public void update(C c, Object arg);

對於您要觀察的每種類型。 不幸的是,您需要知道Observable的具體類型。 但是,您可以更改反射以允許接口等。

假設對象B / C上的操作是相同的,並且您只想區分用於狀態雜耍目的的兩個對象,您還可以創建一個委托對象來實現實際的觀察邏輯/狀態並在主體中使用查找機制object用於檢索特定Observable對象的權限委托。 然后轉發電話。

你總是可以擁有Map<Class<? extends Event>, EventHandler> 在您的偵聽器中Map<Class<? extends Event>, EventHandler> 類似,但沒有明確的'instanceof'運算符。 它在地圖中被containsKey()替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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