Sobes.tech
Middle

Как реализирате шаблона за дизайн 'Стратегия' в PHP?

sobes.tech AI

Отговор от AI

Моделът Стратегия позволява да инкапсулирате различни алгоритми в отделни класове и да ги правите взаимозаменяеми по време на изпълнение на програмата. Клиентският код работи с общ интерфейс на стратегиите, без да знае тяхната конкретна реализация.

Реализацията в PHP включва:

  1. Интерфейс на стратегията: Определя общ метод, който ще реализират всички конкретни стратегии.
  2. Конкретни стратегии: Класове, които реализират интерфейса и съдържат специфична логика на алгоритъма.
  3. Контекст: Клас, който съдържа препратка към обект стратегия и делегира изпълнението на метода на този обект.

Пример:

<?php
// 1. Интерфейс на стратегията
interface SortStrategy
{
    public function sort(array $data): array;
}

// 2. Конкретна стратегия (балонно сортиране)
class BubbleSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        $n = count($data);
        for ($i = 0; $i < $n; $i++) {
            for ($j = 0; $j < $n - 1 - $i; $j++) {
                if ($data[$j] > $data[$j + 1]) {
                    $temp = $data[$j];
                    $data[$j] = $data[$j + 1];
                    $data[$j + 1] = $temp;
                }
            }
        }
        return $data;
    }
}

// 2. Конкретна стратегия (бързо сортиране)
class QuickSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        // Прост пример, в реален код рекурсия
        sort($data); // Използваме вградена функция за илюстрация
        return $data;
    }
}

// 3. Контекст
class SortedList
{
    private SortStrategy $strategy;
    private array $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function setSortStrategy(SortStrategy $strategy): void
    {
        $this->strategy = $strategy;
    }

    public function sort(): array
    {
        if (!isset($this->strategy)) {
            throw new \RuntimeException("Стратегия за сортиране не е зададена.");
        }
        return $this->strategy->sort($this->data);
    }
}

// Използване
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);

// С прилагане на балонно сортиране
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);

// С прилагане на бързо сортиране
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);

Предимства:

  • Гъвкавост: Лесно добавяне на нови алгоритми за сортиране без промяна на контекста.
  • Разширяемост: Нови стратегии могат да бъдат реализирани независимо.
  • Чистота на кода: Контекстът е отделен от логиката на конкретните алгоритми.
  • Тестируемост: Всяка стратегия може да бъде тествана изолирано.