0

对于一个相当简单的问题,我正在努力使用两种不同的设计方法。

我有一项服务(在一般意义上,不是 Web/SOAP 等):

  • 接班Input_
  • 用于Input处理和创建Output本质上只是数据的类,所有这些都依赖于输入数据。

两种不同的设计方法如下:

  • 使用一个OutputCreator知道如何创建和填充的类,Output并将其保留Output为基本的 POCO。拥有所有的 OutputCreator处理逻辑,Output非常简单,不能被滥用。
  • 或者,将Input直接传递给特定类型的Output类。每种类型都Output知道如何处理Input,因此它也支持行为。关键Output数据将由每种不同类型Output将实现的接口定义。

第一种方法意味着我可以将所有处理逻辑置于我的服务内部。第二个意味着我不需要Creator封装了该逻辑的类,但我可能会暴露更多(加上它可能违反 SRP)。

哪种方法更接近最佳实践?

谢谢

4

1 回答 1

0

这在很大程度上取决于您想要实现的目标。

如果您的服务必须具有一定的响应性,那么一种队列似乎就足够了。

这表示:

您的服务接收Input并将其排入InputQueue.

然后您OutputCreator定期从另一个线程读取该队列,创建您的Output并将其放在OutputQueue. 如果这是可能的,并且您的结果可以异步传递,即通过消息,那么您就完成了。

添加到队列和删除可以在线程中完成,因此在相应队列被阻塞时不会阻塞 InputThread 或 OutputThread。

如果您Input期望Output结果,Proactor 模式将解决这个问题。这实现起来更复杂,但在以下 PDF 中对其进行了很好的解释:Doug Schmidt 关于 Proactor 模式 Proactor 的示例可以是 WebServer。

如果您只需要一些调度,反应器模式(几乎如上所述)是首选的解决方案。 Doug Schmidt 关于 Reactor 模式 Reactor 在 C# 或 Java 中实现起来并不难。Reactor 的一个示例可以是中央日志服务器,它将来自不同客户端的 Logentries 写入服务器端日志。

最灵活的是活动对象模式,但最难实现。它甚至将方法调用与方法执行分离。在此处阅读更多内容:Doug Schmidt 关于活动对象 活动对象 的一个​​示例是 CORBA ORB。

于 2012-07-31T13:37:47.210 回答