Patrón de Diseño Estrategia con Symfony

Jneyra
2 min readOct 22, 2021

--

Al igual que todos los patrones de diseño dan solución a ciertos casos, estructuras o comportamientos de un sistema, El patrón Estrategia nos ayuda a definir un contexto a través del cual se tendrá acceso a diferentes rutinas de código, lo que tienen en común estas rutinas son sus condiciones o datos con los cuales se accede al contexto, este logra dar resolución y elección de cual rutina sera ejecutada.

A cada rutina la podemos denominar como una estrategia, un conjunto de estrategias deben pertenecer a un contexto, siendo este el que le de coherencia y justificación de existir a cada estrategia. Ejemplo:

Acciones de un personaje en un Videojuego (Contexto):
- Saltar - Presionar barra Espaciadora (Estrategia)
- Correr - Presionar la tecla Ctrl (Estrategia)
- Golpear - Presionar la tecla Alt (Estrategia)
...

En este pequeño ejemplo esta un contexto que nos permite conocer cuales son las acciones a ejecutar que pueden pertenecer a este contexto puede haber muchas mas pero para ejemplificar con estas basta.

Primero podemos empezar nombrando una clase de manera clara para saber que esa clase ser el contexto de nuestro patrón.

Ejemplo: MainCharacterActionable

Después tenemos que definir que interfaz le dará acceso a cualquiera de nuestras estrategias.

Ejemplo: MainCharacterActuator

Por ultimo podemos definir nombres para cada una de nuestras estrategias

Ejemplo: JumpActuator, RunActuator, HitActuator, …

Ahora, ya se puede aterrizar esta idea al Framework de Symfony y aprovechar algunas de las funcionalidades de este para lograr desarrollar basados en este patrón.

Podemos aprovechar el Service Container y el los elementos CompilerPass, a continuación esta el ejemplo en código

En este compilado de archivos podemos encontrar:

  • Las estrategias declaradas en el Service Container e identificadas por un tag (services.yaml)
  • Un CompilerPass que compilara todas nuestras estrategias que contengan el mismo tag (MainCharacterActionableCompilerPass.php)
  • El CompilerPass dado de alta en el Kernel (Kernel.php)
  • Un contexto que servira para elegir que estrategia ser ejecutada (MainCharacterActionable.php)
  • Una interfaz que sera la implementacion de todas nuestras estrategias (MainCharacterActuator.php)
  • Las Estrategias (JumpActuator.php, RunActuator.php, HitActuator.php)

De esta manera se puede llamar a una estrategia a través de su llave

--

--