我有以下情况:

我有一个QueueReader类,它将从队列中读取消息。我也有一些发件人,例如EmailSender和SMSSender,它们将分别使用Email或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实现一个Event。然后,让我的所有发件人都订阅此活动。发件人将有权访问上面工厂中的信息,以了解消息是否适合他们。

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

现在,我已将所有内容写下来,我认为观察者模式是一种更清洁的方法...

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

谢谢!

最佳答案

我将使用一种混合方法:

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

首先,您可以控制选择哪个发件人(无需公开SenderManager类),从而避免受到ManInTheMiddle类型的攻击。如果您要向其他开发人员公开API来实现自己的发送者,则这一点尤其重要。

其次,您可以实现某种垃圾回收器并丢弃不再需要的发件人,而不是实例化多个发件人并监视您的流为零。

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

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

09-06 00:17