c# - 设计决策 - 工厂模式与观察者模式

标签 c# design-patterns

我有以下场景:

我有一个 QueueReader 类,它将从队列中读取消息。我还有一些发件人,如 EmailSender 和 SMSSender,它们将分别使用电子邮件或 SMS 将这些消息发送给客户端。将来可以添加更多发件人。

我可以想到两种方法,但我不确定哪种方法更有益。

工厂模式:

我可以有一个 SenderManager,它将使用 SenderFactory 创建适当的发件人,然后调用它的 Send() 方法。

因此 QueueReader 在读取消息时将调用 SenderManager 的 Send(),它将执行以下操作:

IMySender sender = SenderFactory.CreateSender()
sender.Send()

//I have the information to create the proper Dispatcher in the 
//factory based upon the message but I have omitted it for brevity.

因此,现在如果我必须添加新的发件人,我将不必更改 QueueReader 或 SenderManager。我将只添加新的 Sender 并修改 SenderFactory。

观察者模式 与上述相反,我可以让 QueueReader 类为 NewMessage 实现一个事件。然后让我所有的发件人订阅这个事件。发件人将有权访问上面工厂中的信息,以了解该消息是否是发给他们的。

这样做的好处是任何新的发件人都只需订阅该事件。

既然我已经写下了所有这些,我认为观察者模式是更简洁的方法...

但是,如果有人有任何见解或建议,请分享。

谢谢!

最佳答案

我会使用混合方法:

SenderManager(观察者)会监听传入的消息并选择正确的发件人(或者在需要时要求 SenderFactory 创建一个)。这有两个好处:

首先,您可以控制选择哪个发件人(您不需要公开 SenderManager 类)避免 ManInTheMiddle 类型的攻击。如果您要为其他开发人员公开 API 以实现他们自己的发送器,这一点尤为重要。

其次,您可以实现一种垃圾收集器并处理不再需要的发送者,而不是拥有多个实例化的发送者并无所事事地监视您的流。

您将需要某种注册功能来针对 SenderManger 注册发件人。

如果您使用 ObserverPattern,请不要忘记实现默认发送器(可以是日志系统)以处理不需要的消息。

关于c# - 设计决策 - 工厂模式与观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860429/

相关文章:

java - Java中通过类和接口(interface)实现不同的用户类型

c# - 如何使用动态数量的波段和列为 DevExpress BandedGridView 正确设置 DataSource

c# - 如何在鼠标单击时选择 TextBox 的所有文本? (TextBox.SelectAll() 不适用于 TextBox.Enter)

c# - 在C#中使用switch来处理所有hives

c# - 什么是 Humble Object 模式,它何时有用?

design-patterns - OO 设计/模式 - 胖模型与事务脚本?

java - 这种情况下如何避免instanceof呢?

Javascript 模块化设计模式 - : self-invoking function, 或对象文字方法哪个更好?

c# - 在 .NET 中使用 OAuth2.0 两条腿的方法访问 Jira API

c# - 外部jar文件包含在monodroid的java绑定(bind)库中吗?