【问题标题】:Can Visitor Design Pattern and Observer Design Pattern be combined?访问者设计模式和观察者设计模式可以结合吗?
【发布时间】: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


【解决方案1】:

我会说观察者模式更适合您的情况。访问者模式适用于您想要向某些无法/不想修改的对象添加功能的场景。

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2011-11-25
    • 2020-12-28
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多