3

我有一个应用程序,我需要用户 Observer 来解决。由于代码实现很长,我想总结一下这个问题。

我启动应用程序。

我有一个登录窗口,我可以在其中选择秘书或学生。

秘书可以为给定课程的学生添加学生、课程和结果。学生只能看到其结果。

我需要使用观察者,以便如果秘书登录到该应用程序的一个实例中并且学生登录到该应用程序的另一个实例中,当秘书在课程中为该学生添加结果时,该学生会立即在其列表中看到新课程及其结果。

数据是从 txt 文件中读取的。

我的解决方案。SecretWindow 是 Observer StudentWindow 是 Observer ResultRepositoryFile 是 Observable 对象

当我单击 AddButton 时,控制器将 Result(studentName, courseName, result) 添加到 ResultRepositoryFile。秘书窗口观察者看到,打印一条消息并保存包含 ResultRepositoryFile 的 txt 文件。

现在在 StudentWindow 中,我单击 RefreshButton,ResultRepositoryFile 从该窗口重新加载到列表中,显示新添加的 Result.class

这是正确的方法吗,因为我有疑问。

如何使用 Observer 同步同一应用程序的两个实例?

感谢您的阅读,希望您能帮助我。

4

2 回答 2

3

如果您打算让多个人同时使用您的应用程序,您应该使用数据库,而不是文本文件。如果多人同时写入文本文件,文本文件可能会损坏。

我建议使用 MySQL 之类的关系数据库。

由于您的学生窗口有一个刷新按钮,您的学生窗口将始终从数据库中提取最新数据。

当秘书将结果添加到数据库时,数据库将锁定,并且不允许任何人访问该结果,并且只有在添加提交到数据库之后才能访问该结果。数据库允许在秘书添加结果的同时访问其他结果。

您不需要 Observed 和 Observable,除非您想通知学生秘书已将结果添加到数据库中。

编辑添加:

秘书窗口是Observed,而Observable是秘书添加到文本文件中的结果。

学生窗口根据 Observable 更新窗口。秘书窗口必须能够根据结果的学生 id 访问学生窗口实例。

于 2012-12-17T15:31:52.207 回答
1

我认为你有点热衷于使用观察者设计模式。假设你还没有阅读设计模式,你将如何实现它。这是我解决这个问题的方法。学生将添加一个标记结果和一个结果对象的关联当秘书为一个主题添加结果时,他会找到所有已登录的学生选择了哪个秘书要添加结果的主题,并简单地将结果标记标记为真(显然文本文件/数据库也需要更新)。当你不想点击数据库/文件只是为了获取结果是否被添加时,可能是因为一些性能因素。现在当学生刷新时他可以简单地从结果对象中获取该页面,而不是从数据库中获取。就个人而言,我更喜欢触发 ajax 调用(基本上是轮询)而不是刷新

于 2012-12-17T15:44:18.650 回答