Sobes.tech
Middle

Hogyan valósítja meg a 'Stratégia' tervezési mintát PHP-ben?

sobes.tech MI

Válasz az MI-től

A Stratégia minta lehetővé teszi különböző algoritmusok inkapszulálását külön osztályokba, és azok futás közbeni cseréjét. A klienskód egy közös stratégia interfésszel dolgozik, anélkül, hogy ismerné a konkrét megvalósítást.

A PHP-ben történő megvalósítás a következőket tartalmazza:

  1. Stratégia interfész: Meghatározza azokat a közös metódusokat, amelyeket minden konkrét stratégia megvalósít.
  2. Konkrét stratégiák: Olyan osztályok, amelyek megvalósítják az interfészt, és tartalmazzák az algoritmus specifikus logikáját.
  3. Környezet: Egy osztály, amely tartalmaz egy hivatkozást egy stratégia objektumra, és delegálja ennek az objektumnak a metódus végrehajtását.

Példa:

// 1. Stratégia interfész
interface SortStrategy
{
    public function sort(array $data): array;
}

// 2. Konkrét stratégia (buboréksorrend)
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. Konkrét stratégia (gyors rendezés)
class QuickSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        // Egyszerű példa, a valódi kódban rekurzív
        sort($data); // Beépített függvény használata
        return $data;
    }
}

// 3. Környezet
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("Rendezési stratégia nincs beállítva.");
        }
        return $this->strategy->sort($this->data);
    }
}

// Használat
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);

// Buborékrendezéssel
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);

// Gyors rendezéssel
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);

Előnyök:

  • Rugalmasság: Új rendezési algoritmusok könnyen hozzáadhatók a kontextus módosítása nélkül.
  • Bővíthetőség: Az új stratégiák függetlenül valósíthatók meg.
  • Kód tisztasága: A kontextus elkülönül a konkrét algoritmusok logikájától.
  • Tesztelhetőség: Minden stratégia külön tesztelhető.