在下面的代码中, 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 回答
这里的问题是,MessageProcessor类试图实现不同Message类的行为 .
相反,您可以将Process()方法添加到IMessage并在每个Message类中实现它 .
界面看起来像,
并且,Dispatch方法可以直接调用此方法
您当前的
MessageProcessor
违反了SRP,因为它会处理多种邮件吗?这是一个可以考虑的选项:
更改MessageStream以将消息发送到Dispatcher .
创建不同的消息处理类 .
在运行时使用Dispatcher注册每个消息处理器 .
Dispatcher将消息路由到正确的处理器 .
当然,这种方法可能只是将OCP问题转移到另一个创建MessageProcessor实例并使用Dispatcher注册的地方 . 但至少它会清理许多
if (message is XXX)
电话 .