In the code below the MessageProcessor
class is violating Open Closed principle - every new IMessage implementation requires a change to this class. Is there a nice clean pattern for this kind of scenario that doesn't violate 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)
{
}
}