我有以下情形:
我有一个QueueReader类,它将从队列中读取消息。我还有一些发送器,如EmailSender和SMSSender,它们将使用电子邮件或SMS向客户发送这些消息。未来可能会添加更多的发送器。
我可以想到两种方法来做这个,我不确定哪一个更有利。
工厂模式:
我可以拥有一个SenderManager,它将使用SenderFactory来创建适当的发送器,然后调用其Send()方法。
因此,QueueReader在读取消息时将调用SenderManager的Send(),该方法将执行以下操作:
所以,现在如果我要添加一个新的发送者,我不需要更改QueueReader或SenderManager。我只需添加新的发送者并修改SenderFactory即可。
观察者模式 与上述相反,我可以让QueueReader类实现NewMessage事件,然后让所有我的发送者订阅此事件。发送者将可以访问上面工厂中的信息,以了解消息是否适用于它们。
这样做的好处是任何新的发送者只需订阅该事件即可。
现在我已经把所有这些写下来,我认为观察者模式是更清晰的方法...
但是,如果有人有任何见解或建议,请分享。
谢谢!
我有一个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。我只需添加新的发送者并修改SenderFactory即可。
观察者模式 与上述相反,我可以让QueueReader类实现NewMessage事件,然后让所有我的发送者订阅此事件。发送者将可以访问上面工厂中的信息,以了解消息是否适用于它们。
这样做的好处是任何新的发送者只需订阅该事件即可。
现在我已经把所有这些写下来,我认为观察者模式是更清晰的方法...
但是,如果有人有任何见解或建议,请分享。
谢谢!
if (x is Foo) DoFoo(x); else if (x is Bar) DoBar(x); else if ...
的代码。无论如何,如果您不想在消息类型中直接使用Send
,我建议使用 DI。 - stakx - no longer contributing