Шаблоны программирования на Swift: Chain of responsibility

Chain_of_responsibility_proSwift_ru

Давайте разберем шаблон программирования Цепочка ответственности (Chain of responsibility)  на Swift в среде разработки XCode

Chain of responsibility

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

Цепочка ответственности (chain of responsibility) – позволяет вам передавать объект по цепочке объектов-обработчиков, пока не будет найден необходимый объект обработчик.

Когда использовать этот паттерн:

  1. У вас более чем один объект — обработчик.
  2. У вас есть несколько объектов обработчика, при этом вы не хотите специфицировать который объект должен обрабатывать в даный момент времени.

Как всегда – пример:

Представим что у нас есть конвеер, который обрабатывает различные предметы которые на нем: игрушки, электронику и другие.
Для начала создадим классы объектов которые могут быть обработаны нашими обработчиками:

Теперь создадим обработчики:

Наш базовый обработчик умеет обрабатывать объекты типа BasicItem. И самое важное – он может иметь ссылку на следующий обработчик (как люди в нашей очереди, которые передают посылку).

Давайте создадим код обработчика игрушки:

Если обработчик получает объект класса Toy – то он его обрабатывает, если нет – то обработчик передает объект следующему обработчику. По аналогии создадим два следующих обработчика: для электроники, и мусора:

Как видим OtherItemsHandler в случае, когда до него дошло дело – объект уничтожает, и не пробует дергать следующий обработчик (последний человек в очереди не проверяет получателя — его функция просто выбросить посылку, если она попала ему в руки).
Давайте тестировать:

Мы в начале создаем обработчик мусора, т.к. все предыдущие обработчики инициализируются с ссылкой на предыдущий обработчик. Таким образом все три обработчика скреплены в цепь и ссылаются один на другой, кроме последнего. Его свойство nexhtHandler = nil. Далее создаем объекты и  пытаемся обработать эти различные созданные элементы. Традиционно лог:

Пример с GitHub

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

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


Опубликовано в Фундаментальные основы, Шаблоны программирования iOS Swift Метки:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*