printПаттерны поведения

printЦепочка обязанностей

Chain Of Responsibility

Назначение
Позволяет избежать привязки отправителя запроса к его получателю, давая шанс обработать запрос нескольким объектам. Связывает объекты-получатели в цепочку и передает запрос вдоль этой цепочки, пока его не обработают.

Результаты
1. Этот паттерн освобождает объект от необходимости «знать», кто конкретно обработает его запрос. Отправителю и получателю ничего неизвестно друг о друге, а включенному в цепочку объекту – о структуре цепочки. Таким образом, цепочка обязанностей помогает упростить взаимосвязи между объектами. Вместо того чтобы хранить ссылки на все объекты, которые могут стать получателями запроса, объект должен располагать информацией лишь о своем ближайшем преемнике.
2.Цепочка обязанностей позволяет повысить гибкость распределения обязанностей между объектами. Добавить или изменить обязанности по обработке запроса можно, включив в цепочку новых участников или изменив ее каким-то другим образом. Этот подход можно сочетать со статическим порождением подклассов для создания специализированных обработчиков.
3. Поскольку у запроса нет явного получателя, то нет и гарантий, что он вообще будет обработан: он может достичь конца цепочки и пропасть. Необработанным запрос может оказаться и в случае неправильной конфигурации цепочки.

Реализация
// Обработчик определяет интерфейс для обработки запросов
class Handler {
protected:
  Handler *next;
public:
  virtual void HandleRequest()=0;
};
class Handler1 : public Handler {
public:
  void HandleRequest() 
  { // если конкретный обработчик способен обработать запрос, то так и делает
    ...
    // иначе направляет его своему преемнику
    next->HandleRequest();
  }
};
// Использование
Handler *first;
first->HandleRequest();
loading