首页 文章

如何通过方法参数避免违反Open Closed?

提问于
浏览
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)
    {
    }
}

2 回答

  • 0

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

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

    界面看起来像,

    public interface IMessage
    {
       Process();
    }
    

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

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

    您当前的 MessageProcessor 违反了SRP,因为它会处理多种邮件吗?

    这是一个可以考虑的选项:

    • 更改MessageStream以将消息发送到Dispatcher .

    • 创建不同的消息处理类 .

    • 在运行时使用Dispatcher注册每个消息处理器 .

    • Dispatcher将消息路由到正确的处理器 .

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

相关问题