Middle
როგორ ახორციელებთ 'სტრატეგია' დიზაინის ნიმუშს 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);
უპირატესობები:
- მოქნილობა: ახალი ალგორითმების ადვილად დამატება კონტექსტის შეცვლის გარეშე.
- გაფართოებადობა: ახალი სტრატეგიები დამოუკიდებლად შეიძლება განხორციელდეს.
- კოდის სისუფთავე: კონტექსტი გამიჯნულია კონკრეტული ალგორითმების ლოგიკიდან.
- ტესტირების შესაძლებლობა: თითოეული სტრატეგია შეიძლება იყოს დამოუკიდებლად ტესტირებული.