Middle
Cum implementați pattern-ul de proiectare 'Strategie' în PHP?
sobes.tech AI
Răspuns de la AI
Modelul Strategie permite încapsularea diferitelor algoritmi în clase separate și face posibilă înlocuirea lor în timpul execuției programului. Codul client lucrează cu o interfață comună a strategiilor, fără a cunoaște implementarea lor concretă.
Implementarea în PHP include:
- Interfața Strategiei: Definește o metodă comună pe care o vor implementa toate strategiile concrete.
- Strategii concrete: Clase care implementează interfața și conțin logica specifică a algoritmului.
- Context: Clasă care conține o referință la un obiect strategie și delegă executarea metodei către acest obiect.
Exemplu:
// 1. Interfața Strategiei
interface SortStrategy
{
public function sort(array $data): array;
}
// 2. Strategie concretă (sortare cu bule)
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. Strategie concretă (sortare rapidă)
class QuickSortStrategy implements SortStrategy
{
public function sort(array $data): array
{
// Implementare simplă pentru exemplu, în cod real ar fi recursiv
sort($data); // Folosim funcția încorporată pentru ilustrație
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("Strategie de sortare ne setată.");
}
return $this->strategy->sort($this->data);
}
}
// Utilizare
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);
// Cu sortare cu bule
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);
// Cu sortare rapidă
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);
Avantaje:
- Flexibilitate: Se pot adăuga noi algoritmi de sortare fără a modifica contextul.
- Extensibilitate: Noile strategii pot fi implementate independent.
- Claritatea codului: Contextul este separat de logica algoritmilor specifici.
- Testabilitate: Fiecare strategie poate fi testată izolat.