Шаблоны программирования на Swift: Template Method
В этой статье мы рассмотрим шаблон программирования Шаблон (Template Method) на Swift в среде разработки XCode
Template Method
Вы заметили как много в нашей жизни шаблонов? Ну к примеру – наше поведение когда мы приходим в незнакомый дом:
- Зайти
- Поздороваться с ясхозяевами
- Раздеться, молясь о том что у нас носки не дырявые
- Пройти, и охать удивляясь какая большая/уютная/забавная квартира
Или же когда мы приходим в квартиру, где происходит ремонт:
- Зайти
- Поздороваться с хозяевами
- Не раззуваться, потому как грязно!
- Поохать когда хозяин квартиры поведает нам смелость его архитектурной мысли!
В целом, все происходит практически одинаково, но с изюминкой в каждом различно случае:) Наверное потому то, это и называется шаблоном поведения. Шаблонный метод задает алгоритму пошаговоую инструкцию. Элементы алгоритма же, определяются в наследующих классах.
Сам паттерн ну очень интуитивный, и я уверен что многие давно уже использовали его. Потому давайте попробуем сделать пример. Вернемся к старой практике, писать примеры по созданию телефонов!
Итак, напишем наш шаблонный класс, при помощи которого будем создавать телефон:
// // proSwift.ru // class AnyPhoneTemplate { func takeBox() { print("Берем коробку") } func takeCamera() { print("Берем камеру") } func takeMicrophone() { print("Берем микрофон") } func assemble() { print("Собираем все вместе") } func makePhone() { takeBox() takeCamera() takeMicrophone() assemble() } }
Как вы уже наверное догадались – сам шаблонный метод, это метод makePhone – который задает последовательность вызовов методов необходимых для складывания телефонов. Давайте теперь научим нашу программу создавать айфоны:
// // proSwift.ru // class iPhoneMaker: AnyPhoneTemplate { func design() { print("Клеим яблоко, и пишем Разработано в Калифорнии") } override func takeBox() { design() super.takeBox() } }
У сборщика яблочных телефонов есть один дополнительный метод – design, а также перегруженный метод takeBox в котором дополнительно вызывается метод design и после этого вызывается родительский метод takeBox.
На очереди сборка Android:
// // proSwift.ru // class AndroidMaker: AnyPhoneTemplate { func addRam() { print("Суем внутрь еще 6 процессоров") } func addCPU() { print("Добавляем вечно нехватающей оперативки") } override func assemble() { addCPU() addRam() super.assemble() } }
У сборщика андроида аж целых два дополнительных метода, и перегружен метод assemble.
Тест здесь конечно же – элементарный
// // proSwift.ru // let android = AndroidMaker() let iPhone = iPhoneMaker() android.makePhone() print("- - - - - - ") iPhone.makePhone()
И традиционный лог в консоль
Берем коробку Берем камеру Берем микрофон Добавляем вечно нехватающей оперативки Суем внутрь еще 6 процессоров Собираем все вместе - - - - - - Клеим яблоко, и пишем Разработано в Калифорнии Берем коробку Берем камеру Берем микрофон Собираем все вместе
—
Один мааленький нюанс: для AndroidMaker код в методах addRam и addCPU перепутан код.