Sobes.tech
Middle

PHPде 'Stratégia' долбоорлоо үлгүсүн кантип ишке ашыратсыз?

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);

Артыкчылыктары:

  • Икемдүү: жаңы алгоритмдерди оңой кошуу мүмкүнчүлүгү, контекстти өзгөртпөстөн.
  • Кеңейүүчү: жаңы стратегиялар көзкарандысыз ишке ашырылат.
  • Коддун тазалыгы: контекст конкреттүү алгоритмдердин логикасынан бөлүнгөн.
  • Тестирлөө мүмкүнчүлүгү: ар бир стратегия изоляцияда тестирленет.