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

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

2.0 Middle🔥 121 комментариев
#Архитектура и паттерны#ООП

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

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

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

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

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

Ключевые поведенческие паттерны в PHP

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

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

interface PaymentStrategy {
    public function pay(int $amount): void;
}

class CreditCardPayment implements PaymentStrategy {
    public function pay(int $amount): void {
        echo "Оплата $amount через кредитную карту\n";
    }
}

class PayPalPayment implements PaymentStrategy {
    public function pay(int $amount): void {
        echo "Оплата $amount через PayPal\n";
    }
}

class ShoppingCart {
    private PaymentStrategy $strategy;
    
    public function setPaymentStrategy(PaymentStrategy $strategy): void {
        $this->strategy = $strategy;
    }
    
    public function checkout(int $amount): void {
        $this->strategy->pay($amount);
    }
}

// Использование
$cart = new ShoppingCart();
$cart->setPaymentStrategy(new CreditCardPayment());
$cart->checkout(1000);

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

Определяет зависимость "один-ко-многим" между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически.

interface Observer {
    public function update(string $eventData): void;
}

class UserNotifier implements Observer {
    public function update(string $eventData): void {
        echo "Отправка уведомления пользователю: $eventData\n";
    }
}

class LogWriter implements Observer {
    public function update(string $eventData): void {
        echo "Запись в лог: $eventData\n";
    }
}

class OrderManager {
    private array $observers = [];
    
    public function attach(Observer $observer): void {
        $this->observers[] = $observer;
    }
    
    public function createOrder(): void {
        // Создание заказа
        $this->notify("Заказ создан");
    }
    
    private function notify(string $data): void {
        foreach ($this->observers as $observer) {
            $observer->update($data);
        }
    }
}

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

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

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

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

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

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

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

В backend-разработке на PHP поведенческие паттерны особенно полезны:

  • Стратегия часто используется для реализации различных способов оплаты, доставки или алгоритмов расчета скидок.
  • Наблюдатель идеален для систем событий (event-driven architecture), уведомлений или логгирования.
  • Посредник (Mediator) упрощает взаимодействие между компонентами сложной системы, уменьшая связанность.
  • Состояние (State) помогает управлять поведением объекта в зависимости от его внутреннего состояния (например, статусы заказа).
  • Итератор (Iterator) предоставляет способ последовательного доступа к элементам коллекции без раскрытия её внутреннего представления.

Преимущества использования

  • Уменьшение связанности между компонентами системы
  • Повышение гибкости и возможности повторного использования кода
  • Упрощение поддержки и тестирования
  • Инкапсуляция изменчивого поведения

Пример комплексного использования

В типичном e-commerce приложении можно одновременно использовать:

  • Стратегию для различных способов оплаты
  • Наблюдателя для уведомлений о изменении статуса заказа
  • Команду для обработки действий администратора
  • Шаблонный метод для стандартизации процесса оформления заказа

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