我有以下情况:
我有一个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,请不要忘记实现默认的发件人(可以是日志系统)以处理不需要的消息。