Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中同时使用Observer和Observable的模型是不是很糟糕?_Java_Model View Controller - Fatal编程技术网

在Java中同时使用Observer和Observable的模型是不是很糟糕?

在Java中同时使用Observer和Observable的模型是不是很糟糕?,java,model-view-controller,Java,Model View Controller,这个问题与MVC(模型-视图-控制器)有关。我的模型当前使用Java中的Observer/Observable模式在视图发生更改时更新视图: public class Model extends Observable { } public class View implements Observer { @Override public void update(observable o, Object obj) { // ... update the view

这个问题与MVC(模型-视图-控制器)有关。我的模型当前使用Java中的Observer/Observable模式在视图发生更改时更新视图:

public class Model extends Observable {
}

public class View implements Observer {

    @Override
    public void update(observable o, Object obj) {
        // ... update the view using the model.
    }

}
这个很好用。然而,我的模型越来越复杂——它开始包含其他类的列表:

public class Model extends Observable {
    List<Person> people = new ArrayList<Person>();
}

public class Person {
    private String name = "";
    // ... getter / setter for name
}
公共类模型扩展了可观察性{
List people=new ArrayList();
}
公共阶层人士{
私有字符串名称=”;
//…名称的getter/setter
}
我的问题是:当一个人的名字改变时,我想更新视图,以监听包含该人的模型。我能想到的唯一方法是让Model实现一个Observer类,并让Person扩展一个Observable类。然后,当这个人发生变化时,他会通知他的观察者(包括父模型)

然而,如果我的模型变得复杂,这似乎需要做很多工作。有没有更好的方法来“冒泡”对父模型进行更改?

首先,使用
可观察的
通常是个坏主意,因为您需要扩展此类才能使用它。
在任何情况下,您所描述的都是观察到的实体的集合。

不要把简单的事情复杂化。让每个实体都是可观察的,让它负责注册和通知。您不必专门包含名为
Model
的类来聚合所有内容。打破你的设计。

你总是可以让你的子类成为
可观察的包含实例。还提到了一些实现该模式的其他方法。

我可以理解不使用Observable的建议。(我还发现了这个:)。但在我看来,我需要维护一个人员列表-必须有某个对象包含此列表,将其保存在视图或控制器中是不正确的。如果您需要在更新
Person
的属性时收到通知,您应该查看
PropertyChangeListener
,这是MVC中的常规方法设计例如
Swing
谢谢,我不知道PropertyChangeListener。谢谢-我将使用Observable进行更改。事实上,使用MVC是不好的设计。你能证明这一点或提供替代方案吗?基本上,MVC不“适合”标准的“现代”UI概念。你必须站在你的头上“分离”设计为这三个人工类别。您确实希望尽可能地保持数据/表示分离,但当您试图分离“视图”和“控制器”时,您必须开始进行无意义的区分。我不同意这一点——在过去几周里,我发现越来越多的需要将逻辑从数据层中分离出来。控制器似乎为程序的逻辑提供了一个良好的家园。是的,您希望在合理可能的范围内“分离逻辑”,但“MVC”分类是人为的,通常对良好的程序结构有害。选择“自然”的类别,并最小化跨类别边界的链接。当你发现自己为了执行一个简单的动作而反复跨越和重新跨越类别边界时,这通常是一个很好的迹象,表明你的边界画得不正确。您经常会发现自己需要的是“数据库”之上的一层来抽象和缓存它。