【发布时间】:2014-05-22 13:01:52
【问题描述】:
在下面的代码中,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)
{
}
}
【问题讨论】:
-
除了签名,
Handle(MoohMessage moo)和Handle(BlahMessage blah)有什么不同?这些应该在单独的类中(可能是通用的)吗? -
为什么
Handle方法需要不同?乍一看,逻辑应该在消息本身上,MessageProcessor应该只调用IMessage上的通用方法来调用它。 -
为什么不将 Process() 方法添加到 IMessage 并调用 message.Process() 而不是 messageProcessor.Handle(message)?
-
@MVarman,让您的评论成为答案。这是答案。
-
消息只是愚蠢的 DTO,它们毕竟是消息,它们本身不会有 Process() 方法。
标签: c# design-patterns language-agnostic open-closed-principle