我将开发一个可以执行以下操作的工具:
从客户端,它每5或10分钟向服务器发送一个请求。 然后服务器发送文件列表。这部分称为“集合”。 “收集”之后,需要“导出”(合并“收集”期间收集的所有文件。
我的想法是,上述“收集”和“出口”行为就像“生产者”和“消费者”。那么,我可以使用“观察者”模式来实现上述操作吗? 如果没有,请提出任何其他设计模式。
此致 Kannan DV
答案 0 :(得分:3)
由于两个组件自然松散耦合,因此您可以单独设计,实现和测试它们。我不认为这里有一种已知模式的固有需求。
但是,如果您希望接收来自收集器的通知,您确实可以查看Observer模式:
观察。定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项。
另一方面,据我所知,当 Exporter 请求时,导出不会完成,但是在固定的时间间隔内,所以 Exporter 可以获得集合随时都可以在收集器(而不是通知系统)中使用一些缓存机制。
答案 1 :(得分:0)
听起来很有希望。要在此提供一个好的建议,有人可能需要有关您的上下文和您对该工具的期望的更多信息。由您自己为组件找到合适的责任分配。
我发现这篇文章非常有助于找到正确的组件切片:
link On the Criteria To Be Used in Decomposing Systems into Modules
答案 2 :(得分:0)
这里的困难在于确保/管理生产者需要知道消费者成功收到该集合的事实。
当它发送文件但没有收到确认收据时,是否会自动将文件保留在原地以供下一次收集,让消费者将其全部排序,或者是否需要用户界面来管理它人的任务,还是什么?
答案 3 :(得分:0)
服务器无法主动通知收集器,这就是收集器轮询服务器的原因。这意味着收集器和服务器之间没有适用的观察者模式。
如果您想让导出器自动启动它的进程,您可以给它一个BlockingQueue,收集器在其上发出通知(即'Job'对象指示需要导出哪些文件)。导出器重复调用queue.take()以获取下一个Job。请注意,BlockingQueue.take()会等待一个元素在队列中可用,而不会占用CPU。请参阅:http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html,其中包含一些示例代码。
答案 4 :(得分:0)
观察者模式可以在这里应用正确的设计...您当前正在轮询您的服务器并消化数据,这本身并不适合观察者模式(如果我理解您的帖子正确)。这里有两个好的选择是让服务器在准备好导出更改/更新/添加时通知JMS队列,然后您可以使用观察者模式接收消息并消化它们。或者,您可以让服务器将数据发布到订阅源(如RSS),然后使用服务轮询订阅源并创建通知(自上次订阅源更新后发生更改)。然后你可以使用观察者模式来消化数据。
如果服务器可能非常频繁地生成导出数据,那么这两个选项都不太合适......但是,如果它们是受控间隔(及时)或仅在一定数量时推送数据数据是可用的(而不是推动频繁更改的环境中的每个更改),然后这可以是一个很好的模型,因为它可以保持组件松散耦合和可重用。直接轮询服务器可能会创建一个不可重用的组件(这里可能没问题,我不知道)。
希望有所帮助。