如何避免使用方法参数违反Open - Closed

本文关键字:Open Closed 何避免 使用方法 参数 | 更新日期: 2023-09-27 18:04:48

下面的代码中,MessageProcessor类违反了开闭原则-每个新的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)
    {
    }
}

如何避免使用方法参数违反Open - Closed

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

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

界面是这样的

public interface IMessage
{
   Process();
}

和Dispatch方法可以直接调用这个方法

public void Dispatch(IMessage message)
{
  message.Process();
}

您当前的MessageProcessor是否违反了SRP,因为它处理多种消息?

这里有一个选项可以考虑:

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

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