Middle
Jak implementujesz wzorzec projektowy 'Strategia' w PHP?
sobes.tech AI
Odpowiedź od AI
Wzorzec Strategia pozwala na enkapsulację różnych algorytmów w oddzielnych klasach i uczynienie ich wymiennymi podczas działania programu. Kod klienta korzysta z wspólnego interfejsu strategii, nie znając ich konkretnej implementacji.
Implementacja w PHP obejmuje:
- Interfejs Strategii: Definiuje wspólną metodę, którą będą implementować wszystkie konkretne strategie.
- Konkretne strategie: Klasy implementujące interfejs i zawierające specyficzną logikę algorytmu.
- Kontekst: Klasa zawierająca odwołanie do obiektu strategii i delegująca wykonanie metody temu obiektowi.
Przykład:
// 1. Interfejs Strategii
interface SortStrategy
{
public function sort(array $data): array;
}
// 2. Konkretna strategia (sortowanie bąbelkowe)
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. Konkretna strategia (szybkie sortowanie)
class QuickSortStrategy implements SortStrategy
{
public function sort(array $data): array
{
// Prosta implementacja na potrzeby przykładu, w rzeczywistości rekurencja
sort($data); // Używamy wbudowanej funkcji dla ilustracji
return $data;
}
}
// 3. Kontekst
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("Strategia sortowania nie ustawiona.");
}
return $this->strategy->sort($this->data);
}
}
// Użycie
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);
// Z użyciem sortowania bąbelkowego
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);
// Z użyciem szybkiego sortowania
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);
Zalety:
- Elastyczność: Można łatwo dodawać nowe algorytmy sortowania bez zmiany kontekstu.
- Rozszerzalność: Nowe strategie mogą być implementowane niezależnie.
- Czytelność kodu: Kontekst jest oddzielony od logiki konkretnych algorytmów.
- Testowalność: Każda strategia może być testowana izolowanym testem.