Volver a la página principal
sábado 15 marzo 2025
4

Implementación del Patrón Strategy en PHP: Un Enfoque Práctico

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.

Entendiendo el Patrón Strategy

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.

Ejemplo Práctico: Sistema de Procesamiento de Pagos

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.

Paso 1: Definir la Interfaz Strategy

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;
}

Paso 2: Implementar las Estrategias Concretas

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";
    }
}

Paso 3: Crear el Contexto

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);
    }
}

Paso 4: Cliente Utilizando el Patrón

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

Ventajas del Patrón Strategy

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.

Mejores Prácticas y Consideraciones

  • Inyección de Dependencias: Favorece la inyección de estrategias para mantener el contexto desacoplado.
  • Interfaz Clara: Asegúrate de que la interfaz Strategy cubra todas las necesidades de los algoritmos.
  • Evita Sobrecarga: No uses este patrón si solo hay un algoritmo o si los cambios son infrecuentes.

Conclusión

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.

Etiquetas:
php
Compartir:
Creado por:
Author photo

Jorge García

Fullstack developer