[英]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
實例添加到您實際想要觀看的許多B
和C
。 它的A
好處是A
的公共界面不那么雜亂,您可以輕松添加新的內部類來處理D
, E
和F
。
與之前的建議類似,您可以將更改更改為。
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.