Какие поведенческие паттерны проектирования ты знаешь?

«Какие поведенческие паттерны проектирования ты знаешь?» — вопрос из категории Паттерны, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поведенческие паттерны описывают эффективные способы взаимодействия и распределения ответственности между объектами.

Основные паттерны в контексте iOS/macOS разработки:

  1. Делегат (Delegate):

    • Суть: Объект поручает другому объекту (делегату) выполнение части своих задач.
    • Пример: UITableViewDelegate, URLSessionDelegate. Определяет протокол с опциональными методами.
      protocol DataFetcherDelegate: AnyObject {
      func fetcher(_ fetcher: DataFetcher, didReceive data: Data)
      func fetcher(_ fetcher: DataFetcher, didFailWith error: Error)
      }
  2. Наблюдатель (Observer):

    • Суть: Объект (наблюдатель) подписывается на уведомления об изменениях в другом объекте (субъекте).
    • Реализации: NotificationCenter, Key-Value Observing (KVO), реактивные фреймворки (Combine, RxSwift).
      // NotificationCenter
      NotificationCenter.default.addObserver(self,
                                         selector: #selector(handleUpdate),
                                         name: .dataDidUpdate,
                                         object: nil)
  3. Стратегия (Strategy):

    • Суть: Инкапсуляция семейства алгоритмов в отдельные классы, делая их взаимозаменяемыми.
    • Пример: Алгоритмы сортировки, способы оплаты, валидации.
      protocol CompressionStrategy {
      func compress(data: Data) -> Data
      }
      class ZIPStrategy: CompressionStrategy { ... }
      class RARStrategy: CompressionStrategy { ... }
  4. Команда (Command):

    • Суть: Инкапсуляция запроса как объекта, позволяющая параметризовать клиентов с различными запросами, ставить их в очередь или логировать.
    • Пример: UIAlertAction, операции Undo/Redo.
  5. Цепочка обязанностей (Chain of Responsibility):

    • Суть: Передача запроса по цепочке обработчиков. Каждый решает, обработать его или передать дальше.
    • Пример: Цепочка обработчиков сетевого запроса, система событий UIResponder.
  6. Состояние (State):

    • Суть: Объект меняет свое поведение при изменении внутреннего состояния. Каждое состояние представлено отдельным классом.
    • Пример: Управление состоянием плеера (Playing, Paused, Stopped).
  7. Хранитель (Memento):

    • Суть: Сохранение и восстановление состояния объекта без нарушения инкапсуляции.
    • Пример: Архитектура Codable для сериализации, NSCoding.
  8. Посредник (Mediator):

    • Суть: Централизованное взаимодействие между группой объектов, уменьшая их прямые связи.
    • Пример: UINavigationController (посредник между ViewController'ами), координатор сцен (Scene Coordinator).