Назовите этот шаблон: использование коллекции предикатных объектов-обработчиков в качестве стратегий - PullRequest
1 голос
/ 13 февраля 2012
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);
        }
    }
}

Это имеет аспекты как стратегии, так и модели цепочки ответственности, а также, возможно, и модели спецификации.

Однако, в отличие от типичной реализации шаблона стратегии, выбор стратегии выполняется самими объектами-обработчиками (такими как цепочка ответственности и спецификация), и может применяться одна или несколько стратегий (в зависимости от реализации).

В отличие от шаблона цепочки ответственности, здесь нет цепочки - обработчики не составлены иерархически, не знают друг друга, и опять может случиться так, что вызывается более одного обработчика.

Это кажется довольно распространенным шаблоном для поддержки расширяемости (с учетом инверсии зависимости и принципа открытого / закрытого), но я не могу назвать его имя. Я видел термин «Шаблон обработчика», но это снова похоже на что-то другое.

Может кто-нибудь сказать мне, как называется этот шаблон?

1 Ответ

0 голосов
/ 13 февраля 2012

Это выглядит довольно похоже на шаблон наблюдателя в некоторых отношениях.IMessageHandler s - наблюдатели, а MessageProcessor - "наблюдаемый объект".По общему признанию обработчики передаются в MessageProcessor во время построения, а не добавляются / удаляются с помощью методов, и обработчики вызываются во время построения, а не в ответ на некоторое «изменение» в наблюдаемом объекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...