2012-09-20 36 views
0

我有觀察者模式的問題。
首先,我有一個HttpHelper類從服務器獲取數據,我使用它作爲Observerable。在java中的雙重觀察者?

public class HttpHelper extends Observable,Runnable{ 
    public void run(){ 
     //do long task to get data 
     String result = getData(); 
     setChanged(); 
     notifyObservers(result); 
    } 
} 

DataManager類完成時從HttpHerlper獲取數據,然後執行一些業務任務。

public class DataManager implements Observer { 
    public void doTask(){ 
    HttpHelper helper = new HttpHelper(); 
    helper.addObserver(this); 
    Thread thread = new Thread(helper); 
    thread.start(); 
    } 
    public void update(Observable obj, Object data) { 
     if (data instanceof String) { 
     // do some stuff with this data 
     // Then I want to notify the result to the view 
     Model model = doSomething(data); 
     notify(model) 
     } 
    } 
} 

Finaaly View類將在DataManager完成任務時更新數據。

public class View{ 
     private void getData(){ 
      DataManager manager = new DataManager() 
      manager.doTask(); 
     } 
     public void update(Observable obj, Object data) { 

     } 
} 

我應該再次使用Observer嗎?我該怎麼做?
P/s:由於某種原因,HttpHelper和DataManager必須分開。
更新:這是階級結構 https://www.dropbox.com/s/givn6vzvqr4cgye/bkd.png

+0

視圖類的目的是什麼?介紹? – Mohayemin

+0

是的,它會顯示數據 – R4j

回答

1

IMO之間HttpHelper和DataManager的關係並不需要一個觀察者模式。這似乎只是通知管理人員處理完成的回調。觀察者更適合通過通用接口將事件分派給多個不同的監聽者,而不是單個監聽者。說了這麼多,你有什麼工作。關於執行回調檢查this article如果你想跟着我的意見,現在

,爲經理和觀點我不同意,你應該使用一個觀察者模式之間的關係,這將允許您創建不同的反應,不同的意見同樣的事件。這意味着它DataManager應該延長Observable,每次聽鑑於它應該實現Observer

最後,我不得不說,如果你打算在具有不同類型的事件時,可觀察到的JDK和觀察員(java.util中)機制不是很乾淨。我最大的批評是更新的第二個參數是Object,所以如果你需要檢查instanceof(如你的例子中一般是not good practice),你最終會得到一個巨大的清單。另一種方法是使用UI類中的事件通知機制(如EventObjectEventListener),它們是UI類的一部分,但實際上比UI更通用。見this other question

哦,如果可以的話,儘量避免級聯事件。它使代碼很難讀取和調試。也許視圖可以直接觀察HttpHelper?

+0

我使用Observer,因爲我有許多DataManager和View實例類,它們監聽來自HttpHellper的更改,作爲更新後的問題。 – R4j

+0

在這種情況下,我可以說級聯事件是可以的,因爲有幾個經理,看起來他們不只是傳播事件,而是實際處理事件並創建與事件相關的新事物,並將事件分派給視圖。添加一些檢查以僅在值更改時分派事件。這將1)最大限度地減少調用的次數和2)如果將來你創建一個監聽器循環,打破無限事件循環 – Hilikus

+0

謝謝,我選擇管理器和視圖之間的關係是觀察者模式,manger和httphelper我使用委託事件監聽器),就像你的建議一樣。 – R4j

1

我認爲你可以使ViewObservable但觀察鏈可能會使您的代碼複雜。

的直接解決方案來找我的是:

讓觀察員控制器

class Controller implements Observer{ 
    DataManager dm; 
    View v; 

    void update(...){ 
     Data d = dm.getData(); 
     v.loadData(d); 
    } 
} 

,讓你Controller觀察HttpHelper