【发布时间】:2020-08-25 19:00:04
【问题描述】:
假设我有一个简单的 Java 程序,它读取一些文件并显示一些数据。
我很困惑,我认为应该应用一种模式,但我无法决定实施哪一种。
这是场景:
每当我选择一个目录时,我希望我的程序显示目录名、所有文件列表和其他数据(如文件大小、文件扩展名等)程序来显示它的路径,如果它是一个图像文件和其他一些东西,可以预览它。
程序会将数据保存在 dataHolder 类中:File selectedDirectory、List filesInthatDirectory、File selectedFile、JSONObject fileData 等...
该程序将有许多 GUI 对象 用于显示;文本字段、面板、标签、列表。
经典的旧方法是在单个方法中编写所有代码 *按一个按钮 -> 在 actionListener 中 *从磁盘获取文件,*读取它们的名称和其他内容,*用数据填充 GUI 对象。这有点糟糕。
所以我决定使用设计模式。然后,每当我单击此按钮并从磁盘读取时,我只会更新 dataHolder 类(setSelectedDirectory、setFileData、fillCurrentFilesList.. 之类的方法)并且这些更新操作会触发 将执行所需的 GUI 更新的类。
但我停留在两种方法之间;
-使用观察者模式,我创建了一些观察者,例如当dataHolder的fileData(JSON)对象更新时,我会通知相关的textFields,然后它们将显示正确的数据。
-但是使用访问者模式,访问者类将处理不同的对象,它会为不同的 GUI 类运行不同的代码。 JList 将尝试显示一个 List 或一些 textFields 将尝试解析一个 JSONObject 并仅显示相关的字符串。但我不需要太多不同的功能,我的意思是我只希望 GUI 对象显示一些数据,我唯一的访问者类将是 DisplayVisitor,它将期望 GUI 显示对象的唯一工作 - 显示数据。如果我需要 doSomethingVisitor、doAnotherThingVisitor、doAmazingThingVisitor... 类,这种方法会很好,但我不需要其他函数。
这两种方法都能奏效吗?我只是无法理解这种情况。它们都提供了一个解决方案,Observer 更简单,但它是否提供处理不同的 GUI 类,例如用 Arraylist 填充 JList 或使 JLabel 显示 jpeg 文件?
或者我可以结合这些模式吗?感谢阅读。
【问题讨论】:
-
"我认为应该应用一种模式..." 为什么?永远不需要模式。 “我很困惑,”这是忘记模式并以最简单的方式解决问题的好理由。考虑在代码运行后重构为模式。听起来模式现在是一个问题而不是解决方案。
标签: java user-interface design-patterns observer-pattern visitor-pattern