Middle
¿Cómo implementa el patrón de diseño 'Estrategia' en PHP?
sobes.tech AI
Respuesta de la IA
El patrón Estrategia permite encapsular diferentes algoritmos en clases separadas y hacerlos intercambiables en tiempo de ejecución. El código cliente trabaja con una interfaz común de estrategias, sin conocer su implementación concreta.
La implementación en PHP incluye:
- Interfaz de Estrategia: Define un método común que todas las estrategias concretas implementarán.
- Estrategias concretas: Clases que implementan la interfaz y contienen la lógica específica del algoritmo.
- Contexto: Clase que contiene una referencia a un objeto estrategia y delega la ejecución del método a ese objeto.
Ejemplo:
// 1. Interfaz de Estrategia
interface SortStrategy
{
public function sort(array $data): array;
}
// 2. Estrategia concreta (ordenamiento burbuja)
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. Estrategia concreta (ordenamiento rápido)
class QuickSortStrategy implements SortStrategy
{
public function sort(array $data): array
{
// Implementación simple para ejemplo, en código real sería recursivo
sort($data); // Usamos función incorporada para ilustrar
return $data;
}
}
// 3. Contexto
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("Estrategia de ordenamiento no establecida.");
}
return $this->strategy->sort($this->data);
}
}
// Uso
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);
// Con ordenamiento burbuja
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);
// Con ordenamiento rápido
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);
Ventajas:
- Flexibilidad: Añadir nuevos algoritmos de ordenamiento sin modificar el contexto.
- Extensibilidad: Nuevas estrategias pueden ser implementadas de forma independiente.
- Claridad del código: El contexto está separado de la lógica de los algoritmos específicos.
- Testeabilidad: Cada estrategia puede ser probada de forma aislada.