代码之家  ›  专栏  ›  技术社区  ›  musiKk

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

  •  0
  • musiKk  · 技术社区  · 14 年前

    我正在构建一个GUI应用程序,并尽可能地坚持MVC原则。

    所以我的模型着火了 PropertyChangeEvent 在…的帮助下 PropertyChangeSupport 所以图形用户界面知道什么时候更新。

    我的应用程序的模型是嵌套的,即我有一个包含一些属性的主模型类,或者 List 其他模型类的,而这些模型类又可能包含更多的模型类。

    一个简单的例子:

    public class MainModel {
        private int someData;
        private List<Stuff> stuffList;
        // imagine PropertyChangeSupport and appropriate getters/setters
        // for both MainModel and Stuff
    }
    

    现在两个 MainModel Stuff 属性更改支持 . 如果有人听到 主模型 ,它得到的变化 someData 以及从列表中添加/删除 stuffList .

    但是如果有人想从对 装箱单 ?有两种可能性:

    1. 观察者必须获取 东西 元素,并分别注册为每个元素的侦听器。
    2. 主模型将自己注册为元素的侦听器 装箱单 当添加这些事件并将其转发给主模型的侦听器时。

    这就是第一种方法的情况:

    mainModelInstance.addListener("new stuff element", new PropertyChangeListener() {
        public void propertyChanged(PropertyChangeEvent evt) {
            Stuff s = (Stuff) evt.getNewValue();
            s.addListener( // ... and so on
            );
        }
    });
    

    我想1。它的优点是保持模型的整洁和哑,但会导致代码重复(许多UI元素必须听取对 装箱单 并动态添加到新的 东西 元素,见上文)。2。相反,客户机代码并没有那么混乱,但是模型在一定程度上起到了监听器的作用,而不知何故,监听器却没有这样的作用。 感觉正确 . 这就是我现在使用第一种方法的原因。

    你有什么想法?也许我对自己太苛刻了。没关系。或者可能有一个完全不同的(更好的)方法?

    1 回复  |  直到 13 年前
        1
  •  1
  •   user292701    13 年前

    至少20年来,我已经为观察其他模型的MVC模型编程(比如做现在被称为MVP[重新呈现器]或MVVM模式),下面是一些我将提供的启发式方法……

    (1)视图和控制器是分层的,而GUI事件处理一直以来都认识到,通过让事件监听器在层次结构的不同级别(如直接在按钮级别或整个网页级别)进行监听,可以实现这一点。每个事件都指定与事件关联的最具体的组件,即使正在监听更高级别的容器(也就是观察到的容器)。事件被称为“泡沫化”。

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

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