gpt4 book ai didi

java - MVC : Property change events for nested models

转载 作者:行者123 更新时间:2023-12-01 16:00:45 24 4
gpt4 key购买 nike

我正在构建一个 GUI 应用程序,并尝试尽可能遵守 MVC 原则。

因此,我的模型在 PropertyChangeSupport 的帮助下触发 PropertyChangeEvent,以便 GUI 知道何时更新内容。

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

一个简单的例子:

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 元素时,主模型将自身注册为它们的监听器,并将这些事件转发到主模型的监听器。

这就是第一种方法的样子:

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.没关系。或者也许有一种完全不同(而且更好)的方法?

最佳答案

至少 20 年来,我一直在编写 MVC 模型并观察其他模型(例如现在称为 MVP[resenter] 或 MVVM 模式的做法),以下是我提供的一些启发式方法...

(1) View 和 Controller 是分层的,GUI 事件处理很早就认识到这一点,方法是让事件监听器在分层结构的不同级别进行监听(例如直接在按钮级别或整个网页级别)。每个事件都指定与该事件关联的最具体的组件,即使正在监听(也称为观察)更高级别的容器。据说事件会“冒泡”。

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

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

关于java - MVC : Property change events for nested models,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3995486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com