Patrón Estrategia

Problema que resuelve: ¿Cómo diseñar el sistema para que varíen los algoritmos o las políticas, pero que estén relacionados a la vez?. ¿Cómo diseñar el sistema para que, según la capacidad, cambien estos algoritmos o políticas?


Intención:
  • Encapsular algoritmos relacionados en clases y  hacerlos intercambiables. 
  • Permitir variar los algoritmos haciéndolos independientes de los clientes que los utilizan. 
Definición – Solución:

• Patrón de comportamiento a nivel de objetos

Define una familia de algoritmos, encapsula cada uno, y los hace intercambiables. Permite que un algoritmo varíe independientemente de los clientes que lo utilizan.

Captura la abstracción en una interfaz, encierra los detalles de implementación en las clases derivadas.

•Es un patrón muy útil para seguir el Principio Abierto/Cerrado ("Una entidad de software -clase, módulo, etcétera- debe estar abierta para su extensión, pero cerrada para su modificación").


En el principio Abierto/Cerrado, "debe estar abierta para su extensión" significa que no se ha de cambiar una clase existente cuando se extiendan sus funciones; "cerrada para su modificación" significa que deben existir subclases o clases abstractas o interfaces en las que delegar las nuevas funciones que se desee añadir. 

•Muestra el poder del polimorfismo en los lenguajes orientados a objetos. 

•Al basarse en el encapsulado y en la programación de interfaces, constituye un buen ejemplo de la aplicación de los principios del diseño orientado a objetos.

Estructura:


• La jerarquía de las clases Estrategia define una familia de algoritmos o comportamientos para ser reutilizados por el contexto. La herencia puede ayudar a organizar la funcionalidad común de los algoritmos.
• Las estrategias eliminan la necesidad de utilizar construcciones condicionales para seleccionar el comportamiento deseado.
• Las estrategias pueden proporcionar diferentes implementaciones a un mismo comportamiento.
• La interfaz de Estrategia es compartida por todas las clases que determinan estrategias concretas, ya sean estas simples o complejas. Por lo tanto, es probable que algunas estrategias concretas no utilicen toda la información pasada a través de esa interfaz (incluso, puede ocurrir que estrategias simples no utilicen nada de dicha información).
• Las estrategias incrementan el número de objetos en una aplicación; a veces se puede reducir esta sobrecarga implementando estrategias como objetos sin estado que los contextos pueden compartir (patrón Singular).

Ejemplo del patrón Estrategia en la Vida Real



Como es bien sabido, una agencia de viajes ofrece el servicio de proporcionar viajes a sus clientes. Mediante ella, una persona puede seleccionar el viaje deseado (medio de transporte, precio, destino) entre los que la agencia pone a disposición de los clientes. Según el patrón Estrategia, el cliente interacciona con la agencia de viajes para seleccionar el comportamiento deseado para su viaje.


Ejemplo software
Existe una gran variedad de algoritmos para dividir un párrafo en líneas.
• Incluir todos estos algoritmos dentro de las clases que los pueden requerir no es deseable por varios motivos:
– Los clientes que necesiten estos algoritmos se hacen más complejos si incluyen el código de los mismos. Esto los hace más grandes y difíciles de mantener, especialmente si soportan varios algoritmos de guionación.
– Diferentes algoritmos pueden ser apropiados en momentos distintos. No es necesario albergar varios algoritmos de guionación si no se usan nunca.
– Es difícil añadir nuevos algoritmos o modificar alguno existente cuando el método de guionación es parte integral del cliente.
• Estos problemas se pueden evitar definiendo clases que encapsulen cada uno de los algoritmos (que podemos denominar estrategia).



Ventajas:
  • Se permite cambiar el algoritmo dinámicamente.
  • Se eliminan sentencias condicionales para seleccionar el algoritmo deseado.