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

design_patterns-visitor_proSwift_ru

 

В этой статье мы разберем шаблон программирования Визитер (Visitor) на языке программирования Swift в среде разработки Xcode.

Visitor

Вот у каждого дома вероятнее всего есть холодильник. В ВАШЕМ доме, ВАШ холодильник. Что будет если холодильник сломается? Некоторые пойдут почитают в интернете как чинить холодильник, какая модель, попробуют поколдовать над ним, и разочаровавшись вызовут мастера по ремонту холодильников. Заметьте – холодильник ваш, но функцию “Чинить Холодильник” выполняет совершенно другой человек, про которого вы ничего не знаете, а попросту – обычный визитер
Паттерн визитер – позволяет вынести из наших объектов логику, которая относится к этим объектам, в отдельный клас, что позволяет нам легко изменять / добавлять алгоритмы, при этом не меняя логику самого класа.
Когда мы захотим использовать этот паттерн:

  1. Когда у нас есть сложный объект, в котором содержится большое количество различных элементов, и вы хотите выполнять различные операции в зависимости от типа этих элиментов.
  2. Вам необходимо выполнять различные операции над классами, и при этом Вы не хотите писать вагон кода внутри реализации этих классов.
  3. В конце–концов, вам нужно добавлять различные операции над элементами, и вы не хотите постоянно обновлять классы этих элементов.

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

И естественно сам склад:

Как видим, наш склад умеет хранить и добавлять товар, но также обладает таинственным методом accept который принимает в себя визитор и вызвает его метод visit. Чтобы картинка сложилась, давайте создадим протокол BasicVisitor и различных визиторов:

Как видим, протокол требует реализацию только одного метода. Теперь давайте перейдем к самим визитерам:

Если почитать код, то сразу видно что визитер при вызове своего метода visit определяет тип объекта который ему передался, и выполняет определнные функции в зависимоти от этого типа. Данный объект просто говорит или вещи на складе поломаны, а так же что ему нравится склад:)

В принципе этот визитер делает тоже самое, только в случае склада он признается что растерян, а в случае товара говорит цену товара!

Теперь давайте запустим то что у нас получилось! Код генерации тестовых даных:

 

Вывод в консоль:

Пример с GitHub

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

Тут все то же самое, что и в примере из книги, за исключением выбора функции для определенного класса. В первом примере мы проверяли принадлежность к тому или иному классу и строили модель поведения исходя из результата этой проверки. А во втором примере вступает в дело особенность языка Swift. Т.к. протокол PlanetVisitor определяет три метода с одним и тем же именем, но разными типами параметров, нам не нужно делать проверку на тип параметра в методе visitSwift сам выберет нужную функцию. Т.е. при выполнении метода map над элементами массива планет каждая планета передается в замыкание, которые мы пишем после. Для определения имени планеты мы использовали NameVisitor, а для определения ее  размера — VolumeVisitor. Но делаем одно и тоже — создаем экземпляр визитера, вызываем метод accept и возвращаем нужное значение.

Метки:

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

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

*