Стратегія (Strategy)


Аналогія

Візьмемо приклад із пухирцевим сортуванням. Ми її реалізували, але зі зростанням обсягів даних сортування почало виконуватися дуже повільно. Тоді ми зробили швидке сортування (Quick sort). Алгоритм працює швидше на великих обсягах, але на маленьких він дуже повільний. Тоді ми реалізували стратегію, за якої для невеликих обсягів даних використовується бульбашкове сортування, а для великих - швидке.

Стисло

Шаблон «Стратегія» дозволяє перемикатися між алгоритмами чи стратегіями залежно від ситуації.

Вікіпедія

Шаблон "Стратегія" дозволяє при виконанні вибирати поведінку алгоритму.

Приклад

Візьмемо вищеописаний приклад. Спочатку зробимо інтерфейс стратегії та реалізації самих стратегій.

interface SortStrategy
{
    public function sort(array $dataset): array;
}

class BubbleSortStrategy implements SortStrategy
{
    public function sort(array $dataset): array
    {
        echo "Sorting using bubble sort";

        // Do sorting
        return $dataset;
    }
}

class QuickSortStrategy implements SortStrategy
{
    public function sort(array $dataset): array
    {
        echo "Sorting using quick sort";

        // Do sorting
        return $dataset;
    }
}

Тепер реалізуємо клієнта, який використовуватиме нашу стратегію.

class Sorter
{
    protected $sorter;

    public function __construct(SortStrategy $sorter)
    {
        $this->sorter = $sorter;
    }

    public function sort(array $dataset): array
    {
        return $this->sorter->sort($dataset);
    }
}

Використання:

$ dataset = [1, 5, 4, 3, 2, 8];
$sorter = New Sorter(New BubbleSortStrategy()); $sorter->sort($dataset); // Output : Cортування бульбашкою
$sorter = New Sorter(New QuickSortStrategy()); $sorter->sort($dataset); // Output: Швидке сортування