El patrón Strategy es una herramienta poderosa en el diseño de software que permite intercambiar algoritmos de manera flexible en tiempo de ejecución. Este patrón pertenece a la categoría de patrones de comportamiento y es ideal para escenarios donde un sistema necesita variar su comportamiento dinámicamente o evitar la proliferación de condicionales complejos. En este artículo, exploraremos cómo implementar el patrón Strategy en PHP mediante un ejemplo práctico.
El patrón Strategy se compone de tres elementos clave:
1. Interfaz Strategy: Define un contrato común para todos los algoritmos.
2. Clases ConcreteStrategy: Implementan algoritmos específicos bajo la interfaz Strategy.
3. Contexto (Context): Mantiene una referencia a un objeto Strategy y lo utiliza para ejecutar el algoritmo seleccionado.
El objetivo es desacoplar la lógica de negocio de los algoritmos que utiliza, facilitando la extensión y mantenimiento del código.
Imaginemos un sistema que procesa pagos mediante diferentes métodos (tarjeta de crédito, PayPal, etc.). Cada método es una estrategia que puede variar independientemente.
Creamos una interfaz que declare el método común para todas las estrategias de pago.
<?php
interface PaymentStrategy {
public function processPayment(float $amount): void;
}
Cada clase concreta implementa la interfaz PaymentStrategy
con su lógica específica.
class CreditCardPayment implements PaymentStrategy {
public function processPayment(float $amount): void {
echo "Procesando pago de €$amount con tarjeta de crédito.\n";
}
}
class PayPalPayment implements PaymentStrategy {
public function processPayment(float $amount): void {
echo "Procesando pago de €$amount mediante PayPal.\n";
}
}
class CryptoPayment implements PaymentStrategy {
public function processPayment(float $amount): void {
echo "Procesando pago de €$amount usando criptomoneda.\n";
}
}
La clase PaymentProcessor
actúa como contexto, utilizando la estrategia configurada.
class PaymentProcessor {
private PaymentStrategy $strategy;
// Inyectar la estrategia inicial (opcional)
public function __construct(PaymentStrategy $strategy) {
$this->strategy = $strategy;
}
// Permite cambiar la estrategia en tiempo de ejecución
public function setPaymentStrategy(PaymentStrategy $strategy): void {
$this->strategy = $strategy;
}
public function processOrder(float $amount): void {
$this->strategy->processPayment($amount);
}
}
El cliente selecciona y configura la estrategia deseada.
// Crear estrategias
$creditCard = new CreditCardPayment();
$paypal = new PayPalPayment();
// Configurar el contexto con una estrategia inicial
$processor = new PaymentProcessor($creditCard);
$processor->processOrder(100.50); // Usa tarjeta
// Cambiar estrategia dinámicamente
$processor->setPaymentStrategy($paypal);
$processor->processOrder(75.30); // Ahora usa PayPal
1. Principio Open/Closed: Añadir nuevas estrategias no requiere modificar el contexto.
2. Elimina Condicionales: Evita estructuras if-else
o switch
complejas.
3. Reutilización y Testeo: Cada estrategia puede probarse y reutilizarse de forma aislada.
El patrón Strategy es ideal para sistemas que requieren flexibilidad en la ejecución de algoritmos. En PHP, su implementación es sencilla gracias al soporte de interfaces y clases. Al adoptar este patrón, no solo mejorarás la mantenibilidad de tu código, sino que también seguirás principios SOLID, preparando tu aplicación para escalar con nuevas funcionalidades.
Jorge García
Fullstack developer