2012-09-20 34 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