PHP Паттерн Стратегия
Паттерн Стратегия (Strategy Pattern) — это поведенческий шаблон проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
Этот паттерн позволяет алгоритмам варьироваться независимо от клиентов, которые их используют. Основная идея заключается в том, чтобы отделить поведение от классов, которые используют алгоритмы, делая их независимыми и легко заменяемыми.
Компоненты паттерна Стратегия:
- Context (Контекст) — Класс, который использует определенную стратегию. Обычно он содержит ссылку на один из вариантов стратегии и может иметь метод для её изменения во время выполнения.
- Strategy (Стратегия) — Интерфейс, который определяет семейство взаимозаменяемых алгоритмов. Обычно он определяет метод, который будет реализован всеми конкретными стратегиями.
- Concrete Strategies (Конкретные Стратегии) — Классы, которые реализуют различные вариации алгоритма, следуя интерфейсу стратегии.
Пример
Допустим, вы разрабатываете систему для расчёта налогов с продаж. Вы можете использовать паттерн Стратегия для определения различных налоговых ставок в зависимости от страны или региона.
// Интерфейс Стратегии
interface TaxStrategy {
public function calculateTax($amount);
}
// Конкретная Стратегия для США
class USTaxStrategy implements TaxStrategy {
public function calculateTax($amount) {
return $amount * 0.07; // Простой пример налога
}
}
// Конкретная Стратегия для ЕС
class EUTaxStrategy implements TaxStrategy {
public function calculateTax($amount) {
return $amount * 0.20; // Другая ставка налога
}
}
// Контекст
class SalesOrder {
private $strategy;
public function __construct(TaxStrategy $strategy) {
$this->strategy = $strategy;
}
public function calculateTax($amount) {
return $this->strategy->calculateTax($amount);
}
}
// Клиентский код
$orderUS = new SalesOrder(new USTaxStrategy());
echo $orderUS->calculateTax(100); // Расчёт налога в США
$orderEU = new SalesOrder(new EUTaxStrategy());
echo $orderEU->calculateTax(100); // Расчёт налога в ЕС
- TaxStrategy — это интерфейс, который определяет метод calculateTax().
- USTaxStrategy и EUTaxStrategy — это конкретные реализации этого интерфейса для разных регионов.
- SalesOrder — это контекст, который использует стратегию. Он не зависит от конкретных алгоритмов налогообложения и может работать с любой стратегией, поданной в конструкторе.