Middle
Ինչպե՞ս եք իրականացնում 'Stratégia' նախագծման ձևանմուշը PHP-ում։
sobes.tech AI
Պատասխան AI-ից
Ստրատեգիայի ձևանմուշը թույլ է տալիս տարբեր ալգորիթմներ ինկապսուլացնել առանձին դասերի մեջ և փոխարինել դրանք ծրագրի գործարկման ժամանակ։ Հաճախորդի կոդը աշխատում է ընդհանուր ինտերֆեյսի հետ, չգիտելով նրանց կոնկրետ իրականացման մասին։
PHP-ում իրականացումը ներառում է՝
- Ստրատեգիայի ինտերֆեյսը: Հստակեցնում է ընդհանուր մեթոդը, որը կիրականացնեն բոլոր կոնկրետ ստրատեգիաները։
- Կոնկրետ ստրատեգիաներ: Դասեր, որոնք իրականացնում են ինտերֆեյսը և պարունակում են ալգորիթմի հատուկ լոգիկան։
- Կոնտեքստ: Դաս, որը պարունակում է ստրատեգիայի օբյեկտի հղում և փոխանցում է մեթոդի կատարմանը այդ օբյեկտին։
Օրինակ՝
<?php
// 1. Ստրատեգիայի ինտերֆեյս
interface SortStrategy
{
public function sort(array $data): array;
}
// 2. Կոնկրետ ստրատեգիա (բուլբուլ դասավորում)
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. Կոնկրետ ստրատեգիա (արագ դասավորում)
class QuickSortStrategy implements SortStrategy
{
public function sort(array $data): array
{
// Պարզ օրինակ, ռեկուրսիվություն
sort($data); // Օգտագործում ենք ներքին ֆունկցիան
return $data;
}
}
// 3. Կոնտեքստ
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("Ստրատեգիայի դասավորումը չի սահմանվել։");
}
return $this->strategy->sort($this->data);
}
}
// Օգտագործում
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);
// Բուլբուլ դասավորությամբ
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);
// Արագ դասավորությամբ
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);
Առավելություններ՝
- Գնահատելիություն՝ հեշտ է ավելացնել նոր ալգորիթմներ առանց կոնտեքստը փոխելու։
- Տարածվածություն՝ նոր ռազմավարությունները կարող են իրականացվել անկախ։
- Կոդի մաքրություն՝ կոնտեքստը բաժանված է կոնկրետ ալգորիթմների տրամաբանությունից։
- Թեստավորման հնարավորություն՝ յուրաքանչյուր ռազմավարություն կարող է փորձարկվել առանձին։