Опубликован: 12.10.2017 | Доступ: свободный | Студентов: 857 / 143 | Длительность: 07:43:00
Лекция 6:

Поведенческие шаблоны проектирования

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

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

В случаях, когда требуется эффективно, компактно, надежно реализовать обработку потока информации с потенциально большим количеством обработчиков, используется шаблон проектирования "Цепочка обязанностей".

В современных системах количество обработчиков во многом определяет оперативность выполнения системой ее функций, поэтому их количество, как правило, достаточно велико.

С одной стороны, все прозрачно и понятно–есть множество типов сообщений, есть множество обработчиков этих сообщений. Задача системы состоит в том, чтобы обрабатывать каждое сообщение в потоке ассоциированным с его конкретным типом обработчика.

Паттерн "Цепочка обязанностей" позволяет реализовать эффективный механизм увязывания типов сообщений и обработчиков.

Если в системе небольшое число обработчиков, то достаточно реализовать данный механизм на базе цикличной конструкции (if, case, whileи пр.). Однако по мере роста и развития систем появляются дополнительные значимые нюансы:

  1. Всегда заранее известно, сколько именно обработчиков необходимо.
  2. Добавление в систему нового типа сообщения приводит к появлению нового обработчика.

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

  1. "Обработчик" определяет интерфейс для обработки запросов.
  2. "Конкретный обработчик" обрабатывает запрос, за который отвечает.
  3. "Конкретный обработчик" направляет запрос к своему преемнику, если не может обработать запрос сам.
  4. По окончании обработки конкретного сообщения исполнение программы передает обработку следующему по цепочке.

Шаблон "Цепочка обязанностей" позволяет:

  • избежать жесткой зависимости отправителя запроса от его получателя;
  • организовать обработку конкретного запроса несколькими объектами, связанными в цепочку;
  • вводить конвейер для запроса с множеством возможных обработчиков;
  • упростить структурные взаимосвязи между объектами. Отправитель запроса хранит ссылку на начало цепочки, а каждый получатель имеет единственную ссылку на своего преемника последующий элемент в цепочке.

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

"Жизненным" примером этого шаблона является компьютерная сеть–большое количество обработчиков, узлов сети (компьютеров, серверов, маршрутизаторов) и еще большее количество типов сетевых запросов:

  1. Сеть передает запрос на свои узлы.
  2. Маршрутизатор передает запрос конкретному обработчику.
  3. Сервер обрабатывает запрос.
Шаблон "Цепочка обязанностей"

Рис. 6.2.11. Шаблон "Цепочка обязанностей"
< Лекция 5 || Лекция 6: 123456 || Лекция 7 >