1

在下面的代码中,MessageProcessor该类违反了 Open Closed 原则 - 每个新的 IMessage 实现都需要对此类进行更改。对于这种不违反 O/C 的场景,是否有一个很好的干净模式?

public interface IMessage
{
}

public class BlahMessage : IMessage
{
}

public class MoohMessage : IMessage
{
}

public class MessageStream
{
    public void Dispatch(IMessage message)
    {
        var messageProcessor = new MessageProcessor();
        messageProcessor.Handle(message);
    }
}

public class MessageProcessor
{
    public void Handle(IMessage message)
    {
        if (message is MoohMessage)
            Handle((MoohMessage)message);

        if (message is BlahMessage)
            Handle((BlahMessage)message);
    }

    private void Handle(MoohMessage moo)
    {
    }

    private void Handle(BlahMessage blah)
    {
    }
}
4

2 回答 2

2

这里的问题是,MessageProcessor 类试图实现不同 Message 类的行为。

相反,您可以将 Process() 方法添加到 IMessage 并在每个 Message 类中实现它。

所以界面看起来像,

public interface IMessage
{
   Process();
}

并且,Dispatch 方法可以直接调用该方法

public void Dispatch(IMessage message)
{
  message.Process();
}
于 2014-05-22T13:18:55.803 回答
0

您当前的 SRP 不是MessageProcessor因为它处理多种消息而违反 SRP 吗?

这是一个需要考虑的选项:

  • 更改 MessageStream 以将消息发送到 Dispatcher。
  • 创建不同的消息处理类。
  • 在运行时向 Dispatcher 注册每个消息处理器。
  • Dispatcher 会将消息路由到正确的处理器。

当然,这种方法可能只是将 OCP 问题转移到另一个地方,在该地方创建 MessageProcessor 实例并使用 Dispatcher 重新注册。但至少它会清理许多if (message is XXX)电话。

于 2014-05-22T19:07:39.977 回答