MVC:嵌套模型的属性更改事件

时间:2010-10-22 09:24:53

标签: java model-view-controller

我正在构建一个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
}

现在,MainModelStuff都有PropertyChangeSupport。如果有人收听了从MainModel触发的事件,则会更改someData以及从列表stuffList添加/删除。

但是如果有人想要通过对stuffList的各个元素所做的更改来获取事件呢?有两种可能性:

  1. 观察者必须获取Stuff元素列表并分别注册为每个元素的监听器。
  2. 主要模型在添加它们时将自身注册为stuffList元素的监听器,并将这些事件转发给主模型的监听器。
  3. 这是第一种方法的样子:

    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.可以。或者可能存在完全不同(且更好)的方式?

1 个答案:

答案 0 :(得分:1)

至少20年来,我已经编写了MVC模型来观察其他模型(比如做现在称为MVP [resenter]或MVVM模式的东西),这里有一些我会提供的启发式算法......

(1)视图和控制器是分层的,并且GUI事件处理早已认识到通过让事件监听器在层次结构的不同级别(直接在按钮级别或整个网页级别)进行监听。每个事件都指定与事件关联的最具体的组件,即使正在收听更高级别的容器(也称为观察到的)。事件被称为“冒泡”。

(2)模型同样可以是分层的。模型生成的“更新”事件也可以使用与上面相同的技术,在事件中指定与更新事件关联的最特定的“内部模型”,但允许在“外部”复合模型级别进行观察。观察者更新事件可以“冒泡”。

(3)分层模型有一个共同的范例......电子表格。每个单元格都是一个模型,用于观察其公式中引用的其他模型/单元格。