Казахстан, Караганды, Карагандинский экономический университет, 2009 |
Поведенческие шаблоны проектирования
Цепочка обязанностей
В случаях, когда требуется эффективно, компактно, надежно реализовать обработку потока информации с потенциально большим количеством обработчиков, используется шаблон проектирования "Цепочка обязанностей".
В современных системах количество обработчиков во многом определяет оперативность выполнения системой ее функций, поэтому их количество, как правило, достаточно велико.
С одной стороны, все прозрачно и понятно–есть множество типов сообщений, есть множество обработчиков этих сообщений. Задача системы состоит в том, чтобы обрабатывать каждое сообщение в потоке ассоциированным с его конкретным типом обработчика.
Паттерн "Цепочка обязанностей" позволяет реализовать эффективный механизм увязывания типов сообщений и обработчиков.
Если в системе небольшое число обработчиков, то достаточно реализовать данный механизм на базе цикличной конструкции (if, case, whileи пр.). Однако по мере роста и развития систем появляются дополнительные значимые нюансы:
- Всегда заранее известно, сколько именно обработчиков необходимо.
- Добавление в систему нового типа сообщения приводит к появлению нового обработчика.
Основная идея этого шаблона заключается в организации конвейера из обработчиков, в котором каждый может либо обработать поступившее сообщение, либо делегировать обработку следующему в конвейере обработчику. Возможен еще вариант обработки и последующей передачи:
- "Обработчик" определяет интерфейс для обработки запросов.
- "Конкретный обработчик" обрабатывает запрос, за который отвечает.
- "Конкретный обработчик" направляет запрос к своему преемнику, если не может обработать запрос сам.
- По окончании обработки конкретного сообщения исполнение программы передает обработку следующему по цепочке.
Шаблон "Цепочка обязанностей" позволяет:
- избежать жесткой зависимости отправителя запроса от его получателя;
- организовать обработку конкретного запроса несколькими объектами, связанными в цепочку;
- вводить конвейер для запроса с множеством возможных обработчиков;
- упростить структурные взаимосвязи между объектами. Отправитель запроса хранит ссылку на начало цепочки, а каждый получатель имеет единственную ссылку на своего преемника последующий элемент в цепочке.
Этот шаблон проектирования достаточно требователен к системным ресурсам. В частности, необходимо убедиться, что программа корректно "отлавливает" случаи необработанных запросов.
"Жизненным" примером этого шаблона является компьютерная сеть–большое количество обработчиков, узлов сети (компьютеров, серверов, маршрутизаторов) и еще большее количество типов сетевых запросов:
- Сеть передает запрос на свои узлы.
- Маршрутизатор передает запрос конкретному обработчику.
- Сервер обрабатывает запрос.