Реальний світ: шаблони дизайну iOS

Шаблон дизайну є поширеною темою на переговорах, форумах і навіть у 15-хвилинній розмові на роботі. Ви можете знайти багато матеріалів у книгах чи в Інтернеті про це та багато прикладів, використовуючи гумові качки , кав’ярню та магазини піци .

Коли я почав вчитися, я зазвичай розумію схему, але у мене було багато проблем, думаючи про те, як застосувати їх до свого коду. Я розумію, що заводський шаблон використовується для створення об'єктів, але навіщо мені це потрібно? Чи справді мені потрібна Фабрика для створення моїх об’єктів?

Моя мета в цій публікації - навести реальні приклади деяких моделей дизайну, які я використовував у своїх проектах.

Стратегія

Шаблон стратегії дозволяє вибрати алгоритм під час виконання. Замість того, щоб реалізувати єдиний алгоритм безпосередньо, код отримує інструкції для виконання, які в сімействі алгоритмів використовувати.

Ми можемо використовувати різні алгоритми на основі часу виконання, іншими словами, нам не байдуже, як здійснюється реалізація.

Алгоритму потрібен об’єкт, який вміє літати, клас Дак знає, як літати, і клас Ракета теж. Наш алгоритм не хвилює, чи потрібно для нашої реалізації розповсюджувати свої крила чи галон газу.

Проблема вирішена за допомогою стратегії

Цей проект нам потрібен, щоб мати змогу отримати viewController, але він також потребує того, щоб мати певні заздалегідь визначені форми поведінки, і це ідеальне місце для застосування схеми стратегії. Поширений ViewController в мобільних додатках - це логін, тому просто створіть протокол, який визначає наші дії та залежності від LoginViewController.

Я маю на увазі, що наш LoginViewController може бути введений у наш проект, ми не дбаємо про інтерфейс користувача, якщо він має tableView, будь-яку анімацію чи методи перевірки, але нам це потрібно, щоб знати, як виконати логін. Детальніше про цю конкретну проблему ви можете прочитати тут.

Заводська

Заводський метод шаблону вирішує проблему створення об'єктів, не вказуючи точний клас об'єкта, який буде створений.

Заводський зразок корисний, коли вам потрібно створити об’єкти під час виконання. Отже, якщо користувач хоче сирної піци, ви створите CheesePizza (), якщо він / вона хоче пепероні, тому PepperoniPizza () ftw.

Проблема вирішена за допомогою фабрики

У тому ж проекті, в якому ми використовуємо шаблон стратегії, щоб вирішити нашу проблему з введенням viewController, ми використовуємо заводський зразок, щоб мати можливість створювати об'єкти під час виконання, передаючи їм усі необхідні їм залежності.

Нам потрібно було висунути екземпляр LoginViewController, який можна створити, використовуючи різні підходи, такі як Storyboards, xib або кодований перегляд. У нас був заводський екземпляр, який можна вводити, змінюючи спосіб об'єкта, який буде створений заводом, змінюючи сам завод.

З екземпляром Factory нам просто потрібно викликати метод збірки. Ця фабрика може бути примірником ViewCodedLoginViewControllerFactory або StoryboardLoginViewControllerFactory, який нас дуже не цікавить, нам просто потрібен він для реалізації методу збирання, який повертає LoginViewController.

Тут ми маємо одну фабрику для кожного виду об’єктів, але у нас може бути одна фабрика, яка вміє будувати ViewController з розкадрівки, xibs або viewcoded.

Декоратор

Шаблон декоратора дозволяє додавати поведінку до окремого об’єкту, статично чи динамічно, не впливаючи на поведінку інших об’єктів із того ж класу.

Це мій улюблений зразок, класичний приклад декоративної схеми - Кав’ярня, яка хоче додати в свою каву збиті вершки та обчислити нову ціну та опис на основі напою.

Проблема вирішена за допомогою декоратора

Нам потрібні різні версії API для кожного виклику служби, це можна зробити різними способами, але ми використовуємо цю схему, щоб додати в Запит спеціальний заголовок. При такому підході ми також можемо бути готовими, якщо в майбутньому один виклик API повинен додати ще один параметр до свого заголовка.

Нам також потрібно було фільтрувати результати в запиті. Що можна зробити, створивши новий метод або змінивши роботу вашого запиту. Ми вирішили використовувати декоратор, щоб додати цю поведінку, оскільки наша послуга використовувалася в інших класах, і ми хочемо змінити якнайменше кількість рядків у попередній реалізації.

Перехідник

Шаблон адаптера - це модель дизайну програмного забезпечення, яка дозволяє використовувати інтерфейс існуючого класу як інший інтерфейс. Він часто використовується для того, щоб існуючі класи працювали з іншими, не змінюючи їх вихідний код.

Розгляньте адаптер як справжній адаптер. Вам потрібен ваш Nintendo 64 , який має складене відео як його вихідний відеоролик для роботи з вашим новим 4k телевізором . Тому вам потрібен адаптер Composite-HDMI.

Проблема вирішена за допомогою адаптера

Нам потрібно було виставити чотири цифри моделі картки, а також бути сумісними з PKPaymentPass. Іншими словами, створили адаптер для перетворення одного екземпляра PKPaymentPass у Card.

Але ми також можемо змішувати шаблони, створюючи більш багаторазовий і підтримуваний код, наприклад, змішуючи наш адаптер із схемою стратегії. Нам дійсно не потрібен об’єкт Картки, нам просто потрібні LastNumbers, тому чому ми не створюємо протокол для цього і бути сумісним з PKPaymentPass, Card та будь-яким іншим об'єктом, який може знадобитися нашому проекту.

Нарешті

Шаблони дизайну дуже допомагають мені створити більше багаторазового коду, заощаджують мені час, коли мені потрібно було змінити деякі речі в кодах, і через них деякі завдання набагато простіше, ніж вони повинні бути.

Якщо ви не зрозумієте, як працюють ці шаблони, - це кілька чудових публікацій про стратегію, фабрику, декоратор та адаптер.

Пс: Якщо вам подобається ця публікація, поділіться нею у Twitter, рекомендуйте її на середньому або обом =). Це дійсно допомагає мені охопити більше людей. Дуже дякую.