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

adapter_proswift_ru

Тема сегодняшней статьи из цикла шаблоны программирования на Swift — шаблон Adapter.

Adapter

Как и раньше, сначала смотрим что нам говорит по этому поводу книга:

Представьте, что Вы едете в коммандировку в США. У Вас есть, допустим, ноутбук купленный в Европе – следовательно вилка на проводе от блока питания имеет круглые окончания. Что делать? Покупать зарядку для американского типа розетки? А когда вы вернетесь домой – она будет лежать у Вас мертвым грузом?

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

Примечание автора: суть вышеизложенной проблемы отображает заглавная картинка к данной статье, однако стоит иметь ввиду что картинка рисовалась явно не российским художником. Т.к. то что художник назвал стандартной вилкой — явно введет в ступор российского пользователя. Но это все лишь формальности…

Так и с Адаптером – он конвертит интерфейс класса – на такой, который ожидается.

Сам паттерн состоит из трех частей: Цели (target), Адаптера (adapter), и адаптируемого (adaptee).

В нашей с вами проблеме:

  1. Target – ноутбук со старой зарядкой
  2. Adapter – переходник.
  3. Adaptee – розетка с квадртаными дырками.

Имплементация паттерна Адаптер на Swift может быть 2.

Простая имплементация Adapter

Итак, первая – это простенькая имплементация. Пускай у нас есть объект Bird, который реализует протокол BirdProtocol:

И пускай у нас есть объект Raven, у которого есть свой интерфейс:

Чтобы использовать ворону в методах которые ждут птицу стоит создать адаптер:

А тестом работоспособности у нас будет функция, которая в качестве параметра принимает объекты, удовлетворяющие протоколу BirdProtocol

Теперь можно запускать тест:

Вполне ожидаемый результат в консоле:

Adapter через делегирование

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

И есть протокол для европейской зарядки:

Если сделать просто реализацию – то получится тоже самое, что и в прошлом примере. Потому мы добавим делегат:

Как видим, у нашего класса есть свойство которое реализует тип EuropeanNotebookChargerDelegate. Так как, наш класс этот протокол реализует, он может свойству присвоить себя.

Теперь, давайте глянем что ж за зверь такой – американская зарядка:

Как видим, в американской зарядке совсем другой метод и мировозрение.

Давайте, создадим адаптер для зарядки:

Адптер реализует интерфейс EuropeanNotebookChargerDelegate и его метод chargetNotebookRoundHoles. Потому, когда вызывается метод charge – на самом деле создается тип европейской зарядки, ей присвается наш адаптер как делегат, и вызывается ее метод charge. Так как делегатом присвоен наш адаптер, при вызове метода chargetNotebookRoundHoles, будет вызыван этот метод нашего адаптера, который в свою очередь вызывает метод зарядки США.
Давайте посмотрим тест код и вывод лога:

Консоль выглядит вот так:

Пример с GitHub практически полностью повторяет первый вариант адаптера

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

Думаю, тут все понятно. Координаты в старом формате это NSNumber, а в новом — это Double. Передаем координаты в новом формате и через адаптер получаем и в старом.

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

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

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

*