我正在构建一个GUI应用程序并尝试尽可能地遵守MVC原则。
因此,我的模型在PropertyChangeEvent
的帮助下触发PropertyChangeSupport
,因此GUI知道何时更新。
我的应用程序的模型是嵌套的,即我有一个主模型类,其中包含一些属性或其他模型类的List
,而这些类可能包含更多的模型类。
一个简单的例子:
public class MainModel {
private int someData;
private List<Stuff> stuffList;
// imagine PropertyChangeSupport and appropriate getters/setters
// for both MainModel and Stuff
}
现在,MainModel
和Stuff
都有PropertyChangeSupport
。如果有人收听了从MainModel
触发的事件,则会更改someData
以及从列表stuffList
添加/删除。
但是如果有人想要通过对stuffList
的各个元素所做的更改来获取事件呢?有两种可能性:
Stuff
元素列表并分别注册为每个元素的监听器。stuffList
元素的监听器,并将这些事件转发给主模型的监听器。这是第一种方法的样子:
mainModelInstance.addListener("new stuff element", new PropertyChangeListener() {
public void propertyChanged(PropertyChangeEvent evt) {
Stuff s = (Stuff) evt.getNewValue();
s.addListener( // ... and so on
);
}
});
我认为1.具有保持模型干净和愚蠢但又导致代码重复的优势(许多UI元素必须收听stuffList
的更改并动态添加到新的Stuff
元素, 往上看)。与2.相反:客户端代码不是那么混乱,但模型部分作为一个监听器,不知何故感觉正确。这就是我目前使用第一种方法的原因。
你有什么想法?也许我对自己太苛刻了2.可以。或者可能存在完全不同(且更好)的方式?
答案 0 :(得分:1)
至少20年来,我已经编写了MVC模型来观察其他模型(比如做现在称为MVP [resenter]或MVVM模式的东西),这里有一些我会提供的启发式算法......
(1)视图和控制器是分层的,并且GUI事件处理早已认识到通过让事件监听器在层次结构的不同级别(直接在按钮级别或整个网页级别)进行监听。每个事件都指定与事件关联的最具体的组件,即使正在收听更高级别的容器(也称为观察到的)。事件被称为“冒泡”。
(2)模型同样可以是分层的。模型生成的“更新”事件也可以使用与上面相同的技术,在事件中指定与更新事件关联的最特定的“内部模型”,但允许在“外部”复合模型级别进行观察。观察者更新事件可以“冒泡”。
(3)分层模型有一个共同的范例......电子表格。每个单元格都是一个模型,用于观察其公式中引用的其他模型/单元格。