¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Design Patterns en PHP
  3. El patrón de diseño Strategy
Extrait - Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición)
Extractos del libro
Design Patterns en PHP Los 23 patrones de diseño: descripciones y soluciones ilustradas en UML2 y PHP (2ª edición) Volver a la página de compra del libro

El patrón de diseño Strategy

Descripción

El patrón de diseño Strategy consiste en encapsular una familia de algoritmos en objetos dedicados de forma que una clase cliente pueda definir de forma dinámica los que desea utilizar y, llegado el caso, permutarlos sin comprometer la correcta ejecución del código.

Esta necesidad puede ponerse de relieve en base a aspectos tales como la presentación, la eficacia en tiempo de ejecución o en memoria, la elección de algoritmos, la representación interna, etc. Aunque evidentemente no se trata de una necesidad funcional de cara a los clientes del objeto, pues las interacciones entre el objeto y sus clientes deben permanecer inmutables.

Ejemplo

En el sistema de venta online de vehículos, la clase VistaCatalogo dibuja la lista de vehículos destinados a la venta. Se utiliza un algoritmo de diseño gráfico para calcular la representación gráfica en función del navegador. Existen dos versiones de este algoritmo:

  • Una primera versión que solo muestra un vehículo por línea (un vehículo ocupa todo el ancho disponible) y que muestra toda la información posible así como cuatro fotografías.

  • Una segunda versión que muestra tres vehículos por línea pero que muestra menos información y una única fotografía.

La interfaz de la clase VistaCatalogo no depende de la elección del algoritmo de representación gráfica. Esta elección no tiene impacto alguno en la relación de una vista de catálogo con sus clientes. Solo se modifica la representación.

Una primera solución consiste en transformar la clase VistaCatalogo en una interfaz o en una clase abstracta y en incluir dos subclases de implementación diferentes según la elección del algoritmo. Esto presenta el inconveniente de complicar de manera inútil la jerarquía de las vistas del catálogo.

Otra posibilidad consiste en implementar ambos algoritmos en la clase VistaCatalogo y en apoyarse en instrucciones condicionales para realizar la elección....

Estructura

1. Diagrama de clases

La figura 26.2 muestra la estructura genérica del patrón de diseño Strategy.

images/figure26-2.png

Figura 26.2 - Estructura del patrón de diseño Strategy

2. Participantes

Los participantes del patrón de diseño Strategy son los siguientes:

  • Estrategia (DibujaCatalogoInterfaz) es la interfaz común a todos los algoritmos. Esta interfaz se utiliza en Entidad para invocar al algoritmo.

  • EstrategiaConcretaA y EstrategiaConcretaB (DibujaUnVehiculoPorLinea y DibujaTresVehiculosPorLinea) son las subclases concretas que implementan los distintos algoritmos.

  • Entidad es la clase que utiliza uno de los algoritmos de las clases que implementan la Estrategia. Por consiguiente, posee una referencia hacia una de estas clases. Por último, si fuera necesario, puede exponer sus datos internos a las clases de implementación.

3. Colaboraciones

La entidad y las instancias de las clases de implementación de la Estrategia interactúan para implementar los algoritmos. En el caso más sencillo, los datos que necesita el algoritmo se pasan como parámetro. Si fuera necesario, la clase Entidad implementaría los métodos necesarios para dar acceso a sus datos internos.

El cliente inicializa la entidad con una instancia de la clase de implementación de Estrategia. Él mismo selecciona esta clase y, por lo general, no la modifica a continuación. La entidad puede modificar...

Dominios de aplicación

El patrón de diseño Strategy se utiliza en los casos siguientes:

  • El comportamiento de una clase puede estar implementado mediante distintos algoritmos siendo alguno de ellos más eficaz en términos de ejecución o de consumo de memoria.

  • La implementación de la elección del algoritmo mediante instrucciones condicionales se vuelve demasiado compleja.

  • Un sistema posee numerosas clases idénticas salvo una parte correspondiente a su comportamiento.

En el último caso, el patrón de diseño Strategy permite agrupar estas clases en una sola, lo que simplifica la interfaz para los clientes.

Ejemplo en PHP

Nuestro ejemplo escrito en PHP está basado en la visualización del catálogo de vehículos, simulado aquí simplemente mediante salidas por pantalla.

La interfaz DibujaCatalogoInterfaz incluye el método dibuja que recibe como parámetro una lista de instancias de VistaVehiculo.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Strategy; 
 
interface DibujaCatalogoInterfaz 
{ 
   public function dibuja(ListaVistaVehiculo 
$listaVistaVehiculo): void; 
} 

La clase ListaVistaVehiculo facilita la gestión de una lista de objetos de la clase VistaVehiculo en PHP. Su código se muestra a continuación.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Strategy; 
 
class ListaVistaVehiculo 
{ 
   protected array $vistasVehiculo = []; 
 
   public function getVistas(): array 
   { 
       return $this->vistasVehiculo; 
   } 
 
   public function agrega(VistaVehiculo $vista): void 
   { 
       $this->vistasVehiculo[] = $vista; 
   } 
} 

La clase DibujaUnVehiculoPorLinea implementa el método dibuja mostrando un vehículo por cada línea (imprime un salto de línea tras mostrar un vehículo).

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Strategy; 
 
class DibujaUnVehiculoPorLinea implements DibujaCatalogoInterfaz 
{ 
   public function dibuja(ListaVistaVehiculo $listaVistaVehiculo): void 
   { 
       echo...