В приведенном ниже коде класс 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)
{
}
}
Проблема заключается в том, что класс MessageProcessor пытается реализовать поведение разных классов сообщений.
Вместо этого вы можете добавить метод Process() в IMessage и реализовать его в каждом классе сообщений.
Таким образом, интерфейс выглядит,
public interface IMessage
{
Process();
}
и метод отправки может вызвать этот метод напрямую
public void Dispatch(IMessage message)
{
message.Process();
}
Разве ваш текущий MessageProcessor
нарушает SRP, потому что он обрабатывает несколько видов сообщений?
Здесь есть возможность рассмотреть:
Конечно, этот подход может просто переключить проблему OCP в другое место, где экземпляры MessageProcessor создаются и регистрируются с Диспетчером. Но, по крайней мере, он очистит многие вызовы if (message is XXX)
.