我一直在关注 Oracle 在本文中提供的修改后的 Model View Controller 示例。 Java SE Application Design with MVC
在此示例中,DefaultController 类声明如下属性名称字符串:
public static final String ELEMENT_TEXT_PROPERTY = "Text";
这些字符串在多个地方使用。
在 Controller 中:
AbstractController 使用反射来搜索其模型中名为 set+propertyName 的方法。
在模型中:
该模型具有调用此方法的 setter 方法:
firePropertyChange(Controller.NAME_PROPERTY, oldName, name);
在 View 中:
在 modelPropertyChange 方法中,
if(evt.getPropertyName().equals(Controller.NAME_PROPERTY)
我关心的部分是模型引用 Controller 的静态字段。我仍在尝试掌握 MVC,并且不确定此架构是否实现了 MVC 所需的解耦。所有三个类都引用 Controller 的静态字段重要吗?
编辑: 本教程中描述的架构(按编码)是否是 MVC 的无效表示?如果是这样,是否可以对其进行更改,以便模型/(模型层)不依赖于 DefaultController 类中定义的静态属性名称?
我意识到这篇文章“只是一个教程”,但如果其中提供的代码没有体现所声称的解耦,我认为社区应该停止引用它作为 MVC 的示例。
最佳答案
我不是 Java(甚至桌面应用程序)开发人员,所以对这一切持保留态度。
首先,任何代码中的static
字段都代表全局状态,这完全违背了面向对象代码中的任何做法。
至于您担心教程中的代码违反SoC,您是对的。但话又说回来,它是一个基础教程,而不是太高级的东西。目标是展示 MVC 三元组的各个部分,并至少从表面上理解它们如何交互以及主要职责是什么。它并不意味着在生产代码中复制粘贴。
一旦明确的迹象就是,这段代码中存在一个“模型对象”。在现实世界中,模型将是一个层。
如果你想更广泛地了解MVC,我可以推荐三本阅读 Material :
关于java - Oracle 修改后的 MVC 示例中的静态属性值是否破坏了预期的解耦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11750324/