如何避免使用方法参数违反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)
{
}
}
这里的问题是,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)
调用。