微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用带有单次和多次返回的工厂模式

如何解决使用带有单次和多次返回的工厂模式

我实现了一个工厂模式,用于处理从 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 的特定子类型的消息处理程序可以返回一个空列表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。