0

我对观察者模式有疑问。
首先,我有一个 HttpHelper 类来从服务器获取数据,我将它用作 Observerable。

 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)
       }
    }
}

最后,View 类将在 DataManager 完成任务时更新数据。

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

       }
 }

我应该再次使用观察者吗?我该怎么做?
P/s:由于某种原因,HttpHelper 和 DataManager 必须分开。
更新:这是类结构 https://www.dropbox.com/s/givn6vzvqr4cgye/bkd.png

4

2 回答 2

1

我认为您可以制作View一个,Observable但观察链可能会使您的代码复杂。

我的直接解决方案是:

制作一个观察者控制器

class Controller implements Observer{
  DataManager dm;
  View v;

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

并让你的Controller观察HttpHelper

于 2012-09-20T03:36:59.107 回答
1

IMO,HttpHelper 和 DataManager 之间的关系不需要观察者模式。似乎只是一个回调,通知经理处理完成。观察者更适合通过公共接口将事件分派给多个不同的侦听器,而不是单个侦听器。话虽如此,你所拥有的将起作用。如果你想听从我的建议,请查看这篇关于实现回调的文章

现在,对于经理和视图之间的关系,我同意您应该使用观察者模式,这将允许您创建对相同事件做出不同反应的不同视图。这意味着它DataManager应该扩展Observable,并且每个监听它的视图都应该实现Observer

最后,我不得不说,如果你打算有不同类型的事件,JDK 的 observable 和 observer (java.util) 机制不是很干净。我最大的批评是 update 的第二个参数是 an Object,所以你最终会得到一个巨大的 if else 列表,你需要instanceof在你的例子中检查,这通常不是好的做法。另一种方法是使用 UI 类(如EventObjectEventListener)中的事件通知机制,它们是 UI 类的一部分,但实际上比 UI 更通用。看到另一个问题

哦,如果可以的话,尽量避免级联事件。它使代码难以阅读和调试。也许视图可以直接观察 HttpHelper?

于 2012-09-20T03:33:31.847 回答