← Назад к вопросам

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

1.0 Junior🔥 121 комментариев
#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Поведенческие паттерны проектирования в iOS-разработке

Поведенческие паттерны проектирования — это шаблоны, которые управляют взаимодействием и ответственностью объектов, упрощая коммуникацию между ними и делая систему более гибкой и расширяемой. В iOS-разработке они особенно важны для создания чистого, поддерживаемого кода. Вот ключевые паттерны, которые я применяю:

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

Классический паттерн в iOS, используемый для передачи ответственности от одного объекта другому. Пример — UITableViewDelegate.

protocol ImageDownloaderDelegate: AnyObject {
    func imageDownloaded(_ image: UIImage)
}

class ImageDownloader {
    weak var delegate: ImageDownloaderDelegate?
    
    func downloadImage(from url: URL) {
        // Загрузка изображения
        let image = UIImage()
        delegate?.imageDownloaded(image)
    }
}

2. Observer (Наблюдатель)

Позволяет объектам подписываться на изменения состояния других объектов. В iOS реализован через NotificationCenter и KVO (Key-Value Observing).

class UserProfile {
    var username: String {
        didSet {
            NotificationCenter.default.post(name: .usernameChanged, object: username)
        }
    }
    
    init(username: String) {
        self.username = username
    }
}

// Подписка на изменения
NotificationCenter.default.addObserver(
    forName: .usernameChanged,
    object: nil,
    queue: .main
) { notification in
    print("Username changed: \(notification.object)")
}

3. Strategy (Стратегия)

Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Часто используется для реализации различных вариантов поведения.

protocol SortingStrategy {
    func sort(_ array: [Int]) -> [Int]
}

class QuickSort: SortingStrategy {
    func sort(_ array: [Int]) -> [Int] {
        // Реализация быстрой сортировки
        return array.sorted()
    }
}

class DataProcessor {
    private var strategy: SortingStrategy
    
    init(strategy: SortingStrategy) {
        self.strategy = strategy
    }
    
    func processData(_ data: [Int]) -> [Int] {
        return strategy.sort(data)
    }
}

4. Command (Команда)

Инкапсулирует запрос как объект, позволяя параметризовать клиентов с различными запросами, ставить их в очередь или логировать.

protocol Command {
    func execute()
}

class LightOnCommand: Command {
    private let light: Light
    
    init(light: Light) {
        self.light = light
    }
    
    func execute() {
        light.turnOn()
    }
}

class RemoteControl {
    private var command: Command?
    
    func setCommand(_ command: Command) {
        self.command = command
    }
    
    func pressButton() {
        command?.execute()
    }
}

5. Iterator (Итератор)

Предоставляет способ последовательного доступа к элементам составного объекта без раскрытия его внутреннего представления. В Swift реализован через протокол IteratorProtocol.

6. State (Состояние)

Позволяет объекту изменять свое поведение при изменении внутреннего состояния. Часто используется в finite-state machines.

protocol PlayerState {
    func play(player: AudioPlayer)
    func pause(player: AudioPlayer)
}

class PlayingState: PlayerState {
    func play(player: AudioPlayer) {
        print("Already playing")
    }
    
    func pause(player: AudioPlayer) {
        print("Pausing playback")
        player.setState(PausedState())
    }
}

7. Chain of Responsibility (Цепочка обязанностей)

Позволяет передавать запросы последовательно по цепочке обработчиков. Каждый обработчик решает, обработать запрос или передать дальше.

8. Mediator (Посредник)

Упрощает взаимодействие множества объектов, инкапсулируя их взаимодействие в отдельном объекте-посреднике. В iOS похожую роль играют UIViewController и координаторы.

9. Memento (Снимок)

Позволяет сохранять и восстанавливать состояние объекта без нарушения инкапсуляции. Используется для реализации undo/redo функциональности.

10. Template Method (Шаблонный метод)

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

Практическое применение в iOS

В реальных iOS-проектах эти паттерны комбинируются:

  • Delegate + Observer для гибкой коммуникации между ViewController'ами
  • Strategy для реализации различных алгоритмов обработки данных
  • Command для системы undo/redo в графических редакторах
  • State для управления жизненным циклом загрузки данных

Ключевое преимущество поведенческих паттернов — уменьшение связанности между компонентами системы, что делает код более тестируемым и адаптируемым к изменениям требований. При выборе паттерна я всегда оцениваю конкретную задачу: например, для простой обратной связи достаточно делегата, а для сложных сценариев с множеством зависимостей лучше подойдет Mediator или Observer.

Важно не слепо применять паттерны, а понимать, какой из них лучше решает конкретную проблему в контексте iOS-экосистемы с её особенностями (ARC, lifecycle объектов, MVC/MVVM архитектурами).

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