the-weapons-of-doom
0

El Patrón Estrategia (Strategy)

Muchas veces, nos encontramos añadiendo clases hijas a nuestras clases originales con el único objetivo de agregarle nuevos comportamientos a nuestros objetos. Otras, sencillamente detectamos que tenemos una clase llena de if, else, swicth… Estos dos síntomas tienen dos diagnósticos: no estamos cumpliendo , respectivamente, el Principio de Inversión de Dependencia y el Principio de Responsabilidad Única. Si eres un talibán de los principios SOLID, ya te habrás dado cuenta por tu cuenta y no necesitas leer este artículo, pero si acabas de salir de la facultad o llevas diez años programando en una fábrica de churros, eres un claro candidato a aprender a utilizar el Patrón Estrategia.

Imaginemos que estamos en un equipo de desarrollo de un juego de acción en primera persona y nos toca el plato fuerte, lo que todo el mundo quiere: las armas. Aquí, nuestro director todavía no tiene muy claro el número de armas totales que tendrá el juego final y, además, desde la productora ya han avisado que tienen planeado desarrollar una expansión con más armas en un futuro cercano. Como ya hemos pasado por esto otras veces, planificamos nuestras clases para evitar la refactorización, ya que nos van a pedir distintas armas que realicen diferentes acciones: disparar, pinchar, explotar, descuartizar…

Lo primero que hacemos es definir las acciones que pueden realizar nuestras armas o, al menos, las que se nos ocurren inicialmente. En este patrón, los distintos comportamientos que puede tomar nuestra clase se llaman Estrategias y se definen utilizando interfaces. Como no sabemos exactamente qué armas vamos a tener que desarrollar, vamos a empezar con sólo dos estrategias: Disparar y Apuñalar.

Somos habituales de los juegos de acción, así que sabemos de sobra que no todas las armas disparan igual y algunas, incluso tienen varios modos de disparo, por lo que necesitamos un nivel más, que defina exactamente cada una de las estrategias Disparar. Este nivel se llama Estrategia Concreta y, en nuestro ejemplo, vamos a definir dos: Tiro y Ráfaga. También definimos ApuñalarCorazón, para nuestra estrategia Apuñalar:

Nuestra estructura de clases va cogiendo forma. Ya tenemos implementados los distintos comportamientos (estrategias) de nuestras armas. El siguiente paso es crear la clase Arma que utilizará estas estrategias. Lo bueno de este patrón es que, cada clase Estrategia es responsable de su propio algoritmo y totalmente independiente de la clase principal, que se denomina Contexto.

Justo cuando terminamos de definir nuestras clases, nos llega una llamada de “los de arriba”, para informarnos de que se ha tomado una decisión y que las armas serán: una pistola, una metralleta, un cuchillo y una estrella ninja. Vaya, en la estrella ninja no habíamos pensado, pero no entramos en pánico, porque sabemos que hemos construido un modelo de clases fácilmente extensible. Simplemente, creamos una nueva estrategia Lanzar, definimos una estrategia concreta LanzarUna y añadimos este comportamiento a nuestro contexto:

Estamos listos para crear nuestras armas. El patrón Estrategia nos permite hacerlo en tiempo de ejecución, por lo que si asignamos a nuestro personaje un objeto Arma como propiedad, podremos ir equipando un arma u otra a medida que vamos jugando. Podremos incluso combinar estrategias  para conseguir un arma más efectiva, aunque no les guste a “los de arriba”.

Y hasta aquí esta breve explicación del Patrón Estrategia. Podéis seguir profundizando en estos dos blogs que me han servido de inspiración: juank.io y danielggarcia. Créditos para los dos y gracias a vosotros por haber leído hasta aquí. Tenéis el código completo en mi Github.

 

Deja un comentario

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