1. Iterator

Iterator (Ітератор) – поведінковий шаблон проєктування. Є об'єктом, що дозволяє отримати послідовний доступ до елементів об'єкта-агрегата без використання описів кожного з агрегованих об'єктів.

Наприклад, такі елементи як дерево, пов'язаний список, хеш-таблиця та масив можна прогорнути (і модифікувати) за допомогою об'єкта Ітератор.

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

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

Такий підхід використовується дуже часто. Наприклад, ти надсилаєш базі даних SQL-запит, а у відповідь вона повертає тобі ітератор (у термінах SQL його зазвичай називають курсором). За допомогою отриманого ітератора ти можеш по черзі брати стоки із SQL-відповіді.

Command

Команда (Command) – поведінковий шаблон проєктування, що використовується в об'єктно-орієнтованому програмуванні, що являє собою дію. Об'єкт команди містить саму дію та її параметри.

Щоб викликати якийсь метод, зазвичай потрібно:

  • посилання на об'єкт;
  • ім'я методу (посилання на метод);
  • значення параметрів методу;
  • посилання на контекст, який містить об'єкти, що використовуються.

Всі ці дані потрібно запакувати до одого об'єкту - Команди (command).

Але й це ще не все: адже команду має хтось виконати. Тож до складу цього патерну входять ще чотири сутності: команди (command), приймач команд (receiver), той, що викликає команди (invoker) та клієнт (client).

Об'єкт Command знає про приймач і викликає метод приймача. Значення параметрів приймача зберігаються у команді. Об'єкт, що викликає (invoker) знає, як виконати команду і, можливо, робить облік та запис виконаних команд. Об'єкт, що викликає, (invoker) нічого не знає про конкретну команду, він знає тільки про інтерфейс.

Обидва об'єкти (об'єкт, що викликає, і кілька об'єктів команд) належать об'єкту клієнта (client). Клієнт вирішує, які команди виконати і коли. Щоб виконати команду, він передає об'єкт команди об'єкту, що викликає (invoker).

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

Використання об'єкта, що викликає (invoker) дозволяє вести облік виконаних команд без необхідності знати клієнту про цю модель обліку (такий облік може стати в нагоді, наприклад, для реалізації скасування та повтору команд).

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

2. Observer

Спостерігач (Observer) – поведінковий шаблон проєктування. Реалізує механізм класу, який дозволяє об'єкту цього класу отримувати сповіщення про зміну стану інших об'єктів і цим спостерігати за ними.

Класи, на події яких інші класи підписуються, називаються суб'єктами (Subjects), а класи, що підписуються, називаються спостерігачами (Observers).

При реалізації шаблону спостерігач зазвичай використовуються такі класи:

  • Observable – інтерфейс, що визначає методи для додавання, видалення та оповіщення спостерігачів;
  • Observer – інтерфейс, за допомогою якого спостерігач отримує оповіщення;
  • ConcreteObservable – конкретний клас, який реалізує інтерфейсObservable;
  • ConcreteObserver – конкретний клас, який реалізує інтерфейс Observer.

Шаблон Спостерігач застосовується у тих випадках, коли в системі:

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

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

3. Visitor

Відвідувач (Visitor) – поведінковий шаблон проєктування, що описує операцію, яка виконується над об'єктами інших класів. При зміні visitor немає необхідності змінювати класи, що обслуговуються.

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

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

Шаблон слід використовувати, якщо:

  • є різні об'єкти різних класів із різними інтерфейсами, але з них необхідно здійснювати операції, залежні від конкретних класів;
  • над структурою необхідно виконати різні операції, які ускладнюють її структуру;
  • часто додаються нові операції над структурою.

4. Mediator

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

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

Посередник визначає інтерфейс обміну інформацією з об'єктами Колеги, Конкретний посередник координує дії об'єктів Колеги.

Кожен клас Колеги знає про свій об'єкт Посередник, всі Колеги обмінюються інформацією лише з посередником, за його відсутності їм довелося б обмінюватися інформацією безпосередньо.

Колегипосилають запити Посереднику і отримують запити від нього. Посередник реалізує кооперативну поведінку за рахунок надсилання кожного запиту одному або декільком Колегам.