public interface IMessageHandler
{
bool Handles(IMessage message);
void Handle(IMessage message);
}
public class FooMessageHandler : IMessageHandler …
public class BarMessageHandler : IMessageHandler …
public class MessageProcessor
{
public MessageProcessor(IEnumerable<IMessageHandler> handlers) …
public void ProcessMessage(IMessage message)
{
foreach(var handler in _handlers.Where(h => h.Handles(message)))
{
handler.Handle(message);
}
}
}
Это имеет аспекты как стратегии, так и модели цепочки ответственности, а также, возможно, и модели спецификации.
Однако, в отличие от типичной реализации шаблона стратегии, выбор стратегии выполняется самими объектами-обработчиками (такими как цепочка ответственности и спецификация), и может применяться одна или несколько стратегий (в зависимости от реализации).
В отличие от шаблона цепочки ответственности, здесь нет цепочки - обработчики не составлены иерархически, не знают друг друга, и опять может случиться так, что вызывается более одного обработчика.
Это кажется довольно распространенным шаблоном для поддержки расширяемости (с учетом инверсии зависимости и принципа открытого / закрытого), но я не могу назвать его имя. Я видел термин «Шаблон обработчика», но это снова похоже на что-то другое.
Может кто-нибудь сказать мне, как называется этот шаблон?