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我使用委托(事件侦听器),就像你的建议一样。