问题描述
我实现了一个工厂模式,用于处理从 MessageBase 类派生的多个消息(例如 StartMessage 等)。
为了处理这些消息,我有从 IMessageHandler 派生的不同处理程序:
public interface IMessageHandler
{
MessageHandleResult HandleMessage(MessageBase message);
}
public class StartMessageHandler: IMessageHandler
{
public MessageHandleResult IMessageHandler.HandleMessage(MessageBase message)
{
...
}
}
要检索处理程序,非常简单:
var messagehandler = MessageHandlerFactory.GetMessageHandlerFor(message);
var result = messagehandler.HandleMessage(message);
但是在新的情况下,我必须处理一种新类型的消息(它也巧妙地从 MessageBase 派生而来)。这条新消息的消息处理程序必须以消息结果列表的形式返回结果:
public class NewMessageHandler: IMessageHandler
{
public List<MessageHandleResult> IMessageHandler.HandleMessage(MessageBase message)
{
...
}
}
关于如何以正确的方式重构的任何想法。在引入这种新的消息类型之前,该解决方案对 6 种类型的消息非常有效。
解决方法
将界面更改为:
public interface IMessageHandler
{
IEnumerable<MessageHandleResult> HandleMessage(MessageBase message);
}
这将使您能够免除 MessageHandlerFactory.GetMessageHandlerFor
步骤,这无论如何都是一种设计味道。
相反,您可以简单地将消息传递给消息处理程序列表并连接结果:
var results = messagehandlers.SelectMany(h => h.HandleMessage(message));
不处理 MessageBase
的特定子类型的消息处理程序可以返回一个空列表。