Вопрос проверяет знание и практический опыт применения паттернов проектирования в PHP-разработке.
Паттерны проектирования - это проверенные решения распространенных проблем в разработке. Адаптер используется для совместимости разных интерфейсов, Фабрика создает объекты без указания точного класса, Стратегия позволяет менять алгоритмы поведения, Observer реализует систему событий. Эти паттерны помогают создавать гибкий, поддерживаемый и масштабируемый код в реальных проектах.
Адаптер (Adapter)
Назначение: Преобразование интерфейса одного класса в интерфейс, ожидаемый клиентом
Применение в PHP: Интеграция сторонних библиотек, работа с разными API
Пример:
php
interface PaymentProcessor {
public function process(float $amount): bool;
}
class PayPalAdapter implements PaymentProcessor {
private $paypal;
public function __construct(PayPal $paypal) {
$this->paypal = $paypal;
}
public function process(float $amount): bool {
return $this->paypal->sendPayment($amount);
}
}Фабрика (Factory)
Назначение: Создание объектов без указания конкретного класса
Применение в PHP: Создание различных типов пользователей, обработчиков платежей
Пример:
php
class UserFactory {
public static function create(string $type): User {
return match($type) {
'admin' => new AdminUser(),
'customer' => new CustomerUser(),
default => new GuestUser()
};
}
}Стратегия (Strategy)
Назначение: Определение семейства алгоритмов и их взаимозаменяемость
Применение в PHP: Различные способы расчета доставки, системы скидок
Пример:
php
interface DiscountStrategy {
public function calculate(float $amount): float;
}
class PercentageDiscount implements DiscountStrategy {
public function calculate(float $amount): float {
return $amount * 0.1; // 10% скидка
}
}
class FixedDiscount implements DiscountStrategy {
public function calculate(float $amount): float {
return 50.0; // Фиксированная скидка
}
}Наблюдатель (Observer)
Назначение: Создание механизма подписки для уведомления объектов об изменениях
Применение в PHP: Системы событий, уведомления, логирование
Пример:
php
class Order {
private $observers = [];
public function attach(Observer $observer): void {
$this->observers[] = $observer;
}
public function complete(): void {
// логика завершения заказа
foreach ($this->observers as $observer) {
$observer->update($this);
}
}
}E-commerce проекты:
Стратегия для различных способов оплаты
Фабрика для создания типов товаров
Наблюдатель для системы уведомлений
CMS системы:
Адаптер для работы с разными базами данных
Фабрика для создания типов контента
Декоратор для модификации вывода контента
API разработка:
Адаптер для форматов ответа (JSON, XML)
Стратегия для методов аутентификации
Наблюдатель для логирования запросов
Вывод: Паттерны проектирования решают типичные проблемы архитектуры приложений, делая код более гибким, поддерживаемым и масштабируемым. Выбор паттерна зависит от конкретной задачи и требований проекта.