gpt4 book ai didi

java - java中的双观察者?

转载 作者:行者123 更新时间:2023-12-02 07:34:07 25 4
gpt4 key购买 nike

我对观察者模式有疑问。
首先,我有一个 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)
}
}
}

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

  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

最佳答案

IMO,HttpHelper 和 DataManager 之间的关系不需要观察者模式。看起来只是一个回调,通知管理器处理完成。观察者更适合通过公共(public)接口(interface)将事件分派(dispatch)给多个不同的监听器,而不是单个监听器。话虽如此,你所拥有的将会起作用。检查this article如果您想听从我的建议,请了解如何实现回调

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

最后,我不得不说,如果你计划有不同类型的事件,JDK observable 和observer (java.util) 机制不是很干净。我最大的批评是 update 的第二个参数是一个 Object ,因此您最终会得到一个巨大的 if else 列表,您需要在其中检查 instanceof 就像您的示例中一样,一般来说是 not good practice 。另一种方法是使用 UI 类中的事件通知机制(例如 EventObjectEventListener),它们是 UI 类的一部分,但实际上比 UI 更通用。请参阅this other question

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

关于java - java中的双观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12505578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com