strategy

Imagina que eres el director técnico de un equipo de fútbol, y tienes un juego muy importante el próximo domingo, ¿cómo plantearías el juego?.

Como eres un buen director técnico, tienes que prever los posibles escenarios y tener una estrategia preparada para cada contexto.

De esa manera la formación y/o comportamiento de tus jugadores deberían cambiar dependiendo de los diversos factores que se presenten en el desarrollo juego, tales como: cuando atacas, cuando defiendes, expulsan a un jugador, vas ganando, vas perdiendo, juegan de visita, juegan de local, el rival es débil, el rival es fuerte, etc.

Nuestra planificación sería de esta manera:
Strategy

Con esto en mente veamos la parte técnica.

Definición

Este patrón define un conjunto de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que el algoritmo pueda variar independientemente de los clientes que lo utilicen.

Esto quiere decir que nuestros objetos deben estar preparados para afrontar diversos contextos sin cambiar las interacciones de estos con el cliente.

Recuerda: Un algoritmo encapsulado es una estrategia

Modelo UML

strategy-uml

Participantes:

Las clases y objetos que participan en este modelo son:

  • Strategy
    • Declara una interfaz común para todos los algoritmos compatibles. El Contex utiliza esta interfaz para llamar al algoritmo definido por un ConcreteStrategy
  • ConcreteStrategy
    • Implementa el algoritmo utilizando la interfaz de Strategy
  • Context
    • Está configurado con un objeto ConcreteStrategy
    • Mantiene una referencia a un objeto de Strategy
    • Puede definir una interfaz que le permite acceder a sus datos Strategy.

Strategy Pattern en Acción

Strategy en acción

Notas

El patrón Strategy (estrategia) es una alternativa a la herencia, si estás pensando usar la herencia para poder agregar nuevos comportamientos a tus objetos, sería conveniente usar este patrón

Si dentro de tu clase haces uso intensivo de las condicionales if, else, swicth, case, eso quiere decir que tu clase tiene asignado muchos comportamientos y/o responsabilidades, lo cual suele ser un indicador de la necesidad aplicar el patrón Strategy (estrategia), para poder encapsular estos comportamientos y delegarlos a otra clase u objeto.

show

Veamos como se traduce la definición de este patrón a un código PHP

Context

Definimos nuestra clase Context, donde se pasarán las estrategias

Strategy

Defendimos una interface StratageyInterface del cual se implementaran las demás estrategias

ConcreteStrategy

Definimos una estrategia concreta llamada ConcreteStrategyA que encapsula nuestro algoritmo de comportamiento

Definimos otra estrategia concreta llamada ConcreteStrategyB que encapsula otro algoritmo de comportamiento

Main

Este seria la manera como invocaríamos a nuestro código

Ejemplos del Mundo Real

Veamos la implementación de de una pequeña tienda virtual
Strategy Patern en acción con PHP

Conclusiones

Al usar este patrón estaremos cumpliendo 2 principios de SOLID que son: el principio de Responsabilidad única y el principio de Abierto y Cerrado, lo cual nos ayudará mucho cuando deseamos extender y/o añadir nuevas funcionalidades a nuestras clases sin mayores dolores de cabeza

Benjamín

Soy Benjamín Gonzales B, desarrollador de Software con más de 10 años de experiencia, me apasiona todo lo relacionado a las nuevas tecnologías y el software libre. Me gusta investigar , leer y aprender cada día algo nuevo. Desarrollo en LINUX,PHP, JAVA, C#, Javascript, MySql, SqlServer, entre otros y actualmente ando experimentando con lenguajes funcionales como: Erlang, Clojure y Scala. Y otros no funcionales como GO.

Latest posts by Benjamín (see all)

Strategy Pattern (Patrón Estrategia)
Compartir
Tweet about this on TwitterShare on Facebook1Share on Google+0Share on LinkedIn0Email this to someonePin on Pinterest0Share on Tumblr0Share on Reddit0Share on StumbleUpon0
Etiquetado en:                        

Un pensamiento en “Strategy Pattern (Patrón Estrategia)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *