El patrón Estrategia (Strategy) es un patrón de
diseño para el desarrollo de software. Se clasifica como patrón de
comportamiento porque determina como se debe realizar el intercambio de
mensajes entre diferentes objetos para resolver una tarea. El patrón estrategia
permite mantener un conjunto de algoritmos de entre los cuales el objeto
cliente puede elegir aquel que le conviene e intercambiarlo dinámicamente según
sus necesidades.
Motivación
Suponiendo
un editor de textos con diferentes algoritmos para particionar un texto en
líneas (justificado, alineado a la izquierda, etc.), se desea separar las
clases clientes de los diferentes algoritmos de partición, por diversos
motivos:
- Incluir el código de los algoritmos en los clientes hace que éstos sean demasiado grandes y complicados de mantener y/o extender.
- El cliente no va a necesitar todos los algoritmos en todos los casos, de modo que no queremos que dicho cliente los almacene si no los va a usar.
- Si existiesen clientes distintos que usasen los mismos algoritmos, habría que duplicar el código, por tanto, esta situación no favorece la reutilización.
La
solución que el patrón estrategia supone para este escenario pasa por
encapsular los distintos algoritmos en una jerarquía y que el cliente trabaje
contra un objeto intermediario contexto. El cliente puede elegir el algoritmo
que prefiera de entre los disponibles, o el mismo contexto puede ser el que
elija el más apropiado para cada situación.
Colaboraciones
Es
necesario el intercambio de información entre estrategia y contexto. Este
intercambio puede realizarse de dos maneras:
- Mediante parámetros en los métodos de la estrategia.
- Mandándose, el contexto, a sí mismo a la estrategia.
Los
clientes del contexto lo configuran con una estrategia concreta. A partir de
ahí, solo se interactúa con el contexto.
Consecuencias
La
herencia puede ayudar a factorizar las partes comunes de las familias de
algoritmos (sustituyendo el uso de bloques de instrucciones condicionales). En
este contexto es común la aparición conjunta de otros patrones como el patrón
plantilla.
El uso
del patrón proporciona una alternativa a la extensión de contextos, ya que
puede realizarse un cambio dinámico de estrategia.
Los
clientes deben conocer las diferentes estrategias y debe comprender las
posibilidades que ofrecen.
Como
contrapartida, aumenta el número de objetos creados, por lo que se produce una
penalización en la comunicación entre estrategia y contexto (hay una dirección
adicional).
Implementación
Entre
las posibilidades disponibles a la hora de definir la interfaz entre estrategia
y contexto, están:
- Pasar como parámetro la información necesaria para la estrategia implica un bajo acoplamiento y la posibilidad de envío de datos innecesarios.
- Pasar como parámetro el contexto y dejar que la estrategia solicite la información que necesita supone un alto acoplamiento entre ellos.
- Mantener en la estrategia una referencia al contexto (similar al anterior).
También
puede ocurrir que se creen y se utilicen los objetos estrategia en el contexto
sólo si es necesario, en tal caso las estrategias serán opcionales.
Participantes:
IStrategy: declara una interfaz común para todos las variantes de un algoritmo.
StrategyX: implementa una variante del algoritmo.
StrategyClient: es el responsable de crear y mantener una referencia a una estrategia concreta.
Colaboraciones:
El cliente de la estrategia decide la estrategia a crear.
Consecuencias:
Factoriza aspectos comunes de una familia de algoritmos y utilizarlos en las clases base de la jerarquía.
Aumenta cohesión del cliente
Sistematiza el uso de implementaciones alternativas
El cliente es el responsable de crear estrategias, por tanto debe comprender las posibilidades que ofrecen, esto es, debe ser relevante para el contexto del cliente.
Menor eficiencia. Aumenta el número de objetos creados.
IStrategy: declara una interfaz común para todos las variantes de un algoritmo.
StrategyX: implementa una variante del algoritmo.
StrategyClient: es el responsable de crear y mantener una referencia a una estrategia concreta.
Colaboraciones:
El cliente de la estrategia decide la estrategia a crear.
Consecuencias:
Factoriza aspectos comunes de una familia de algoritmos y utilizarlos en las clases base de la jerarquía.
Aumenta cohesión del cliente
Sistematiza el uso de implementaciones alternativas
El cliente es el responsable de crear estrategias, por tanto debe comprender las posibilidades que ofrecen, esto es, debe ser relevante para el contexto del cliente.
Menor eficiencia. Aumenta el número de objetos creados.
Consideraciones:
• 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 construccionescondicionales 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)
No hay comentarios:
Publicar un comentario