3

作为一名 Java Swing 新手,我在将用户界面逻辑与域逻辑分开时遇到了一些麻烦。

我有一个带有 JFrame 的小型(微不足道?)Swing 应用程序,其中包含一个 JLabel、JTextField 和一个 JButton。当按下 JButton 时,会弹出一个 JFileChooser 对话框。选择文件后,JTextField 包含文件的绝对路径。到目前为止没有什么壮观的。我要完成的下一件事是将文件的这个绝对路径“注入”到文件管理器类中,该类将在进行选择并更新 JTextField 时处理文件的实际处理(每次选择文件时)使用 JButton)。

我的问题:

  1. 如何让文件管理器知道何时开始读取文件?(例如计算该文件中的行数)
  2. 如何以在 UI 层内共享最少信息的方式实现域层?我应该向 UI 添加文件管理器实例吗?
  3. 我应该使用 JTextField 的值作为对文件管理器的引用,还是应该使用 JButton 操作将值设置到文件管理器中?我的意思是:使用 JTextField 的 propertychangelistener 或使用 JButton 的 actionlistener?
  4. 我应该使用 filebean 将文件的绝对路径存储在域层中还是直接将其插入文件管理器?不同之处在于:当我使用属性更改侦听器时,绝对文件路径的值可以在 UI 输入更改时更新,但是当我直接使用构造函数或设置器插入值时,我必须在文件管理器中处理更改而不是处理文件bean中的更改。
  5. 如何在域逻辑内的文件管理器内引用 UI 中使用的文件bean?
  6. 领域逻辑和业务逻辑一样吗?我的意思是:文件管理器类应该在包whatever.b-logic中,而filebean类应该在包whatever.domain中?

该应用程序分为几个包:

  • 随便:主类
  • 不管什么.presentation : 摇摆的东西
  • 不管是什么域名:数据的东西
  • 不管是什么逻辑:应用程序逻辑

我希望我足够清楚...

提前感谢您的清理工作。

4

2 回答 2

4

就个人而言,当我处理这类问题时,我会尝试将可重用性和责任(谁负责什么)作为主要要求。

也就是说,我尝试将我的模型设置在如此远的地方,以便他们不关心数据来自或去往的方式或地点,它们只是提供接口访问来实现它。

要将所有元素连接在一起,我依靠模型向客户端提供事件,因为模型不应该关心谁想知道,只需提供所需的功能。因此,为了向客户提供反馈,我将依赖一系列听众。

我会将侦听器分解为特定的工作,文件读取的此类通知将是它自己的侦听器,对模型的更改(添加/删除/更新)文件 bean 将是另一个。其他通知将需要不同的侦听器,这会阻止您创建实现并不想知道的怪物侦听器。

对于在模型中设置值,我会在属性设置器/获取器方面犯错。这将您的模型与实现分离(如果您以自动化方式使用模型怎么办??)

如果可能,内部数据最好由模型管理。也就是说,如果您更改模型正在管理的文件 bean 上的属性,那么模型应该能够监视更改并进行处理。话虽如此,您可能在将来的某个时候想要一个哑模型,您可以在其中批量更新一系列文件 bean,然后要求模型自行更新。

我个人可能会提供模型在外部更新的方法,同时提供至少一种能够提供自我监控的实现,这使您可以灵活地为正确的情况选择正确的模型。

这里也存在内存泄漏的危险。如果您在不再需要文件 bean 时没有从文件 bean 中正确删除它们,您最终可能会阻止 bean 在以后被垃圾收集。

在可能的情况下,使用接口。在尝试将这些模型组合在一起时,这提供了很大的灵活性。

对于您所描述的,我将允许文件 bean 由文件管理器负责,以便文件管理器成为文件 bean 的容器。

取决于您的项目有多大以及您将来可能希望如何重用代码,这将极大地影响代码的布局。

我通常将 UI 代码放在一个 UI 包和子包中,但那只是我。我倾向于将接口内容与实现内容分开(通常物理上在单独的 Jar 文件中,但同样是我)。这意味着我只需要包含接口库和我可能使用的任何实现,如果需要(或直接根据需要)使用某种工厂来实际实例化实现。以 JDBC 驱动程序为例。

你想着眼于领域的责任。根据您的描述,我觉得文件 bean 属于文件管理器的职责范围,因此我将两者绑定在一起。

这只是我的观点

于 2012-07-16T23:29:08.233 回答
4

这里有一些建议:

  • 使用SwingWorker,如图所示在监听进度的同时保持 GUI 活跃。

  • 使用(此处Action说明) 来封装功能。

  • Use File,一个方便的、跨平台的抽象。使用它来组合新的抽象,而不是提取非跨平台的部分。

附录:另见A Swing 架构概述答案

于 2012-07-17T00:03:18.230 回答