我正在努力解决两个不同的设计方法,以解决一个相当简单的问题。
我有一个服务(在一般意义上,而不是Web / SOAP等):
Input
班级Input
来处理和创建一个基本上只是数据的Output
类,所有这些都依赖于输入数据。两种不同的设计方法如下:
OutputCreator
的{{1}}类,并将Output
基本上保留为POCO。 Output
具有所有处理逻辑,OutputCreator
非常简单,不会被滥用。Output
直接传递给特定类型的Input
类。每种类型的Output
都知道如何处理Output
,因此它也支持行为。密钥Input
数据将由每个不同类型的Output
将实现的接口定义。第一种方法意味着我可以将所有处理逻辑都放在我的服务内部。第二个意味着我不需要Output
类来封装该逻辑,但是我可能会暴露更多(加上它可能会违反SRP)。
哪种方法更接近最佳做法?
由于
答案 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。