java中的双观察者?

java中的双观察者?,java,observer-pattern,Java,Observer Pattern,我对观察者模式有问题。 首先,我有一个HttpHelper类从服务器获取数据,我使用它作为可观察的对象 public class HttpHelper extends Observable,Runnable{ public void run(){ //do long task to get data String result = getData(); setChanged(); notifyObservers(result); }

我对观察者模式有问题。
首先,我有一个HttpHelper类从服务器获取数据,我使用它作为可观察的对象

 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)
       }
    }
}
最后,视图类将在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必须分开。
更新:下面是类结构

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

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

最后,我必须指出,如果您计划使用不同类型的事件,JDK observable和Observator(java.util)机制就不是很干净。我最大的批评是update的第二个参数是一个
对象
,因此您最终会得到一个庞大的if-else列表,您需要在其中检查
instanceof
,就像您的示例中一样,通常是这样。另一种方法是使用UI类中的事件通知机制(如
EventObject
EventListener
),它们是UI类的一部分,但实际上比UI更通用。看


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

我认为您可以将
视图
变成一个可观察的
视图,但这种观察链可能会使您的代码变得复杂

我立即想到的解决办法是:

做一个观察者控制器

class Controller implements Observer{
  DataManager dm;
  View v;

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

并让您的
控制器
观察
HttpHelper

查看类的目的是什么?演示文稿?是的,它将显示我使用的DataObserver,因为我有许多DataManager和View实例类,这些类与HttpHellper不同,作为更新的问题。在这种情况下,我会说级联事件是可以的,因为有几个管理者,他们似乎不仅仅是在传播事件,而是在实际处理它,并用它创建一些新的内容,这就是发送到视图的内容。添加一些检查以仅在值更改时分派事件。这将1)最大限度地减少调用数量,2)如果将来创建侦听器循环,则会中断无限的事件循环。谢谢,我选择管理器和视图之间的关系是观察者模式,管理器和httphelper我使用委托(事件侦听器),就像你的建议一样。