服务/ API设计模式 - 这是首选方法?

时间:2012-07-31 13:23:12

标签: c# java design-patterns

我正在努力解决两个不同的设计方法,以解决一个相当简单的问题。

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

  • 收到Input班级
  • 使用Input来处理和创建一个基本上只是数据的Output类,所有这些都依赖于输入数据。

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

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

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

哪种方法更接近最佳做法?

由于

1 个答案:

答案 0 :(得分:0)

这很大程度上取决于你想要达到的目标。

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

这意味着:

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

然后你的OutputCreator定期从另一个线程中读取该队列, 创建Output并将其放在OutputQueue上。 如果可以,您的结果可以异步传递,即 通过一条消息,你已经完成了。

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

如果您的Input期望Output,那么Proactor模式就会出现 解决这个问题这实现起来比较复杂,但可以很好地解释 在以下PDF中:Doug Schmidt on Proactor Pattern Proactor的一个示例可以是WebServer。

如果您只需要一些调度,那么Reactor Pattern(几乎与描述一样) 以上)是首选的解决方案。 Doug Schmidt on Reactor Pattern 在C#或Java中实现Reactor并不是很困难。 Reactor的示例可以是写入的中央日志记录服务器 从不同客户到服务器端日志的分类。

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

相关问题