Назад к вопросам
Middle
228
questionbank
Как вы реализуете паттерн проектирования 'Стратегия' в PHP?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech 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("Sorting strategy not set.");
}
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);
Преимущества:
- Гибкость: Легко добавлять новые алгоритмы сортировки без изменения контекста.
- Расширяемость: Новые стратегии могут быть реализованы независимо.
- Чистота кода: Контекст отделен от логики конкретных алгоритмов.
- Тестируемость: Каждая стратегия может быть протестирована изолированно.