Sobes.tech
Middle

Hoe implementeert u het ontwerp patroon 'Strategie' in PHP?

sobes.tech AI

Antwoord van AI

Het Strategie-patroon maakt het mogelijk om verschillende algoritmen in aparte klassen te encapsuleren en ze tijdens de uitvoering uitwisselbaar te maken. De client-code werkt met een gemeenschappelijke interface van strategieën, zonder hun concrete implementatie te kennen.

De implementatie in PHP omvat:

  1. Strategie-interface: Definieert een gemeenschappelijke methode die alle concrete strategieën zullen implementeren.
  2. Concrete strategieën: Klassen die de interface implementeren en de specifieke logica van het algoritme bevatten.
  3. Context: Klasse die een verwijzing bevat naar een strategie-object en de uitvoering van de methode aan dat object delegeert.

Voorbeeld:

// 1. Strategie-interface
interface SortStrategy
{
    public function sort(array $data): array;
}

// 2. Concrete strategie (bubbelsortering)
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. Concrete strategie (snelle sortering)
class QuickSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        // Eenvoudige implementatie voor voorbeeld, in echte code recursief
        sort($data); // Gebruik ingebouwde functie voor illustratie
        return $data;
    }
}

// 3. Context
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("Sorteerstrategie niet ingesteld.");
        }
        return $this->strategy->sort($this->data);
    }
}

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

// Met bubbel sortering
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);

// Met snelle sortering
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);

Voordelen:

  • Flexibiliteit: Nieuwe sorteeralgoritmen kunnen eenvoudig worden toegevoegd zonder de context te wijzigen.
  • Uitbreidbaarheid: Nieuwe strategieën kunnen onafhankelijk worden geïmplementeerd.
  • Codehelderheid: De context is gescheiden van de logica van de specifieke algoritmen.
  • Testbaarheid: Elke strategie kan geïsoleerd worden getest.