Middle
Kā jūs īstenojat 'Strategijas' dizaina paraugu PHP?
sobes.tech AI
Atbilde no AI
Stratēģijas paraugs ļauj inkapsulēt dažādus algoritmus atsevišķās klasēs un tos mainīt programmas izpildes laikā. Klienta kods darbojas ar kopēju stratēģiju interfeisu, nezinot to konkrēto realizāciju.
PHP realizācija ietver:
- Stratēģijas interfeiss: Nosaka kopēju metodi, ko īstenos visas konkrētās stratēģijas.
- Konkrētas stratēģijas: Klases, kas īsteno interfeisu un satur specifisku algoritma loģiku.
- Konteksts: Klase, kas satur atsauci uz stratēģijas objektu un deleģē metodes izpildi šim objektam.
Piemērs:
<?php
// 1. Stratēģijas interfeiss
interface SortStrategy
{
public function sort(array $data): array;
}
// 2. Konkrēta stratēģija (burbuļsorts)
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ēta stratēģija (ātrs sorts)
class QuickSortStrategy implements SortStrategy
{
public function sort(array $data): array
{
// Vienkārša realizācija piemēram, rekursija
sort($data); // Izmanto iebūvēto funkciju
return $data;
}
}
// Konteksts
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("Sortēšanas stratēģija nav iestatīta.");
}
return $this->strategy->sort($this->data);
}
}
// Lietošana
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);
// Ar burbuļsortu
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);
// Ar ātro sortu
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);
Priekšrocības:
- Elastība: viegli pievienot jaunus algoritmus bez konteksta izmaiņām.
- Paplašināmība: jaunas stratēģijas var realizēt neatkarīgi.
- Koda tīrība: konteksts ir atdalīts no konkrēto algoritmu loģikas.
- Testējamība: katra stratēģija var tikt testēta izolēti.