Danyloff

Шаблон Strategy


  • ·

· ·

Шаблон Strategy является одним из базовых шаблонов проектирования, который позволяет определить семейство алгоритмов, инкапсулировать их и взаимозаменять в зависимости от конкретных ситуаций. Этот шаблон основывается на извлечении участков кода, которые изменяются в зависимости от контекста, в отдельные классы, называемые стратегиями.

Структура шаблона Strategy

Структура шаблона Strategy включает следующие компоненты:

  • Контекст (Context) — это класс, который содержит ссылку на выбранный объект стратегии и делегирует ему выполнение задачи.
  • Абстрактная стратегия (Strategy) — это интерфейс или абстрактный класс, который объявляет методы, которые классы-стратегии должны реализовать.
  • Конкретные стратегии (Concrete Strategies) — это классы, которые реализуют методы, определенные в абстрактной стратегии, и предоставляют различные алгоритмы выполнения задачи.

Пример использования шаблона Strategy на PHP 📇

Предположим, у нас есть система доставки товаров, которая должна поддерживать различные стратегии расчета стоимости доставки в зависимости от типа товара. Для этого мы можем использовать шаблон Strategy на PHP.

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. Вы можете адаптировать его под свои потребности и использовать его в своих проектах.


Так же интересно