Middle
PHP-də 'Strateji' dizayn nümunəsini necə həyata keçirirsiniz?
sobes.tech Süni İntellekt
AI-dan cavab
Strateji nümunəsi müxtəlif alqoritmləri ayrı sinflərdə inkapsulyasiya etməyə və onları proqramın icrası zamanı dəyişdirməyə imkan verir. Müştəri kodu ümumi strategiyalar interfeysi ilə işləyir və onların konkret tətbiqini bilməz.
PHP-də tətbiq aşağıdakıları əhatə edir:
- Strateji interfeysi: Bütün konkret strategiyaların həyata keçirəcəyi ümumi metodu müəyyən edir.
- Konkret strategiyalar: Interfeysi həyata keçirən və alqoritmin xüsusi məntiqini ehtiva edən sinflər.
- Kontext: Strategiya obyektinə istinad saxlayan və metodun icrasını həmin obyektə həvalə edən sinif.
Nümunə:
// 1. Strateji interfeysi
interface SortStrategy
{
public function sort(array $data): array;
}
// 2. Konkret strategiya (baloncuk sıralaması)
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. Konkret strategiya (sürətli sıralama)
class QuickSortStrategy implements SortStrategy
{
public function sort(array $data): array
{
// Sadə nümunə üçün, real kodda rekursiv
sort($data); // İstifadə olunan daxili funksiya
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("Sıralama strategiyası təyin edilməyib.");
}
return $this->strategy->sort($this->data);
}
}
// İstifadə
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);
// Baloncuk sıralaması ilə
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);
// Sürətli sıralama ilə
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);
Üstünlüklər:
- Elastiklik: Yeni alqoritmlər asanlıqla əlavə edilə bilər, konteksti dəyişdirmədən.
- Genişləndirmə: Yeni strategiyalar müstəqil şəkildə həyata keçirilə bilər.
- Kodun aydınlığı: Kontekst, xüsusi alqoritmlərin məntiqindən ayrılıb.
- Test ediləbilərlik: Hər strategiya müstəqil şəkildə test edilə bilər.