Шаблон Strategy
- ·
-
Шаблон Strategy является одним из базовых шаблонов проектирования, который позволяет определить семейство алгоритмов, инкапсулировать их и взаимозаменять в зависимости от конкретных ситуаций. Этот шаблон основывается на извлечении участков кода, которые изменяются в зависимости от контекста, в отдельные классы, называемые стратегиями.
Структура шаблона Strategy
Структура шаблона Strategy включает следующие компоненты:
- Контекст (Context) — это класс, который содержит ссылку на выбранный объект стратегии и делегирует ему выполнение задачи.
- Абстрактная стратегия (Strategy) — это интерфейс или абстрактный класс, который объявляет методы, которые классы-стратегии должны реализовать.
- Конкретные стратегии (Concrete Strategies) — это классы, которые реализуют методы, определенные в абстрактной стратегии, и предоставляют различные алгоритмы выполнения задачи.
Пример использования шаблона Strategy на PHP 📇
Предположим, у нас есть система доставки товаров, которая должна поддерживать различные стратегии расчета стоимости доставки в зависимости от типа товара. Для этого мы можем использовать шаблон Strategy на PHP.
<?php
// Абстрактная стратегия
interface DeliveryStrategy
{
public function calculateCost(float $weight, float $distance): float;
}
// Конкретная стратегия
class RegularStrategy implements DeliveryStrategy
{
public function calculateCost(float $weight, float $distance): float
{
// Расчет стоимости доставки для обычных товаров
return $weight * 0.5 + $distance * 0.1;
}
}
// Конкретная стратегия
class ExpressStrategy implements DeliveryStrategy
{
public function calculateCost(float $weight, float $distance): float
{
// Расчет стоимости доставки для экспресс-доставки
return $weight * 2 + $distance * 0.5;
}
}
// Контекст
class DeliveryContext
{
private $strategy;
public function __construct(DeliveryStrategy $strategy)
{
$this->strategy = $strategy;
}
public function setStrategy(DeliveryStrategy $strategy)
{
$this->strategy = $strategy;
}
public function calculateCost(float $weight, float $distance): float
{
return $this->strategy->calculateCost($weight, $distance);
}
}
// Использование шаблона Strategy
// Создание контекста с выбранной стратегией
$regularDelivery = new RegularStrategy();
$context = new DeliveryContext($regularDelivery);
// Расчет стоимости доставки для обычных товаров
$regularCost = $context->calculateCost(10, 100);
echo "Стоимость доставки обычных товаров: $regularCost" . PHP_EOL;
// Изменение стратегии
$expressDelivery = new ExpressStrategy();
$context->setStrategy($expressDelivery);
// Расчет стоимости доставки для экспресс-доставки
$expressCost = $context->calculateCost(10, 100);
echo "Стоимость экспресс-доставки: $expressCost" . PHP_EOL;
В этом примере у нас есть абстрактная стратегия DeliveryStrategy, которая объявляет метод calculateCost(). Два класса RegularStrategy и ExpressStrategy реализуют эту абстрактную стратегию и определяют различные алгоритмы расчета стоимости доставки. Контекст DeliveryContext делегирует выполнение задачи выбранной стратегии.
Мы создаем объект DeliveryContext с выбранной стратегией RegularStrategy и используем его для расчета стоимости доставки обычных товаров. Затем мы изменяем стратегию на ExpressStrategy и расчитываем стоимость экспресс-доставки.
Это всего лишь пример реализации шаблона Strategy на PHP. Вы можете адаптировать его под свои потребности и использовать его в своих проектах.