在MVC中,模型做了什么以及与SwingWorker的关系是什么?

我读了很多关于Java,Swing,MVC和SwingWorker的内容,但我对模型在MVC中的作用感到困惑。 我正在构建一个有两个按钮的应用程序: 选择文件 读取文件 还有一个用于记录的文本框。 我目前在做什么: 视图包含小部件,但没有逻辑 按钮的actionPerformed()方法调用Controller上的方法 Controller将获取所需数据(包括显示OptionPane.showOpenDialog())以获取文件 文件引用存储在模型中。 模型通知(PropertyChangeSupport,Observer模式)新文件的视图。 View启用“读取文件”按钮 我的第一个问题:我应该将状态存储在模型中吗?也就是说,与操作顺序有关的信息:首先必须在可以读取文件之前选择文件。那么我的模型将成为状态机。 我的第二个问题:我让Controller显示OptionPane是否正确? 然后开始有趣。用户单击“读取文件”按钮。我做的与“选择文件”按钮大致相同。 View调用Controller,但Controller使用SwingWorker读取文件,因为这不应该在EDT上完成。 SwingWorker发布中间日志消息,这些消息通过对View(SwingWorker.process()方法)的引用添加到文本框中。 Controller从SwingWorker中侦听“状态”属性更改。当'state'为'DONE'时,Controller调用'get()'函数。如果一切正常,结果将在模型中设置。如果不是,则处理异常。 我的第三个也是最重要的问题:模型不应该读文件吗?! MVC的重点在于关注点的分离,以及所有的好处(可测试性等)。如果我想要一个新视图(例如CLI)怎么办?那么我的模型现在只是一个数据模型。它没有关于如何读取文件的线索!那么线程问题呢? 希望你能给我一些好的建议。互联网上有很多关于SwingWorker,MVC等的例子。但我的问题不在于如何对它们进行编码,而是如何设计。     
已邀请:
我认为你已经走上了正轨。逐一回答您的问题: 1.我应该在模型中存储状态吗? 是的,您可以并且应该在您的模型中存储状态 - 模型是改变该状态的状态和行为。 2.让控制器显示OptionPane是否正确? 是 - 应用程序设计(逻辑流程)决定文件的来源 - 模型当然不关心如何获取要读取的文件名,只是它获取文件名。 flow是控制器的域。 3.模型不应该读文件吗? 是的,文件阅读是模型的一部分。即使控制器正在调用摇摆工作者,摇摆工作者在概念上也是模型的一部分,至少是摇摆工作者执行的主要逻辑。理想情况下,加载文件的所有逻辑都存在于模型类中。然后,控制器可以使用摇摆工作者来安排呼叫。控制器是谁决定文件加载应该在后台线程上发生,并指示模型从后台加载文件。控制器的swing工作器从模型接收加载进度事件,并通过调用publish()来处理这些事件,然后process()更新UI。 原则上,您应该能够将整个应用程序重写为控制台应用程序,而无需更改模型。当然,视图会发生变化,但这是因为它现在必须使用stdout而不是Swing来呈现模型。最大的变化发生在控制器中 - 应用程序流程将不同(文件选择来自程序参数),控制器不再监听按钮点击以直接流程,但要么具有固定流程,要么通过stdin与用户交互。并且控制器中的线程模型是不同的 - 无需担心EDT,因此不需要摆动工作者。 所以你看,模型处理状态并改变状态,视图负责呈现状态,控制器执行其他所有操作,特别是将模型连接到视图。     

要回复问题请先登录注册