Patrón de Estrategia
En el patrón de estrategia (Strategy Pattern), el comportamiento de una clase o su algoritmo puede cambiarse en tiempo de ejecución. Este tipo de patrón de diseño pertenece a los patrones de comportamiento.
El patrón de estrategia define una serie de algoritmos o estrategias y encapsula cada algoritmo en una clase independiente, lo que permite que puedan reemplazarse entre sí. Mediante el uso del patrón de estrategia, se pueden seleccionar diferentes algoritmos en tiempo de ejecución según sea necesario, sin necesidad de modificar el código del cliente.
En el patrón de estrategia, creamos objetos que representan varias estrategias y un objeto context cuyo comportamiento cambia según el objeto de estrategia. El objeto de estrategia cambia el algoritmo de ejecución del objeto context.
Introducción
Intención
Encapsular cada algoritmo para que puedan utilizarse de forma intercambiable.
Problema principal que resuelve
- Resuelve el problema de la complejidad y la difícil mantenibilidad que produce el uso de sentencias condicionales (como if...else) cuando existen múltiples algoritmos similares.
Escenarios de uso
- Cuando en un sistema hay muchas clases y la única diferencia entre ellas es su comportamiento.
Forma de implementación
- Definir la interfaz de estrategia: Todas las clases de estrategia implementarán esta interfaz unificada.
- Crear las clases de estrategia concretas: Cada clase de estrategia encapsula un algoritmo o comportamiento específico.
- Clase de contexto: Contiene una referencia a un objeto de estrategia e invoca la estrategia a través de dicha referencia.
Código clave
- Interfaz de estrategia: Define los métodos que todas las clases de estrategia deben implementar.
- Clases de estrategia concretas: Implementan la interfaz de estrategia y contienen la implementación específica del algoritmo.
Ejemplos de aplicación
- Estrategias en sobres: Cada sobre representa una estrategia y contiene diferentes tácticas.
- Selección del medio de viaje: Ir en bicicleta, tomar el autobús, etc. Cada medio es una estrategia reemplazable.
- LayoutManager de Java AWT: Diferentes administradores de diseño implementan la misma interfaz, pero proporcionan diferentes algoritmos de diseño.
Ventajas
- Cambio flexible de algoritmo: Se pueden cambiar los algoritmos en tiempo de ejecución según sea necesario.
- Evita múltiples sentencias condicionales: Elimina las complejas sentencias condicionales.
- Buena extensibilidad: Para agregar un nuevo algoritmo solo se necesita añadir una clase de estrategia, sin modificar el código existente.
Desventajas
- Aumento del número de clases de estrategia: Cada algoritmo adicional requiere agregar una clase de estrategia.
- Todas las clases de estrategia deben exponerse: Las clases de estrategia deben ser públicas para que puedan seleccionarse y utilizarse.
Recomendaciones de uso
- Cuando hay múltiples algoritmos o comportamientos en el sistema y pueden reemplazarse entre sí, utilice el patrón de estrategia.
- Cuando el sistema necesita seleccionar algoritmos dinámicamente, el patrón de estrategia es una opción adecuada.
Precauciones
- Si hay demasiadas clases de estrategia en el sistema, considere usar otros patrones o técnicas de diseño para resolver el problema de la proliferación de clases.
Estructura
El patrón de estrategia incluye los siguientes roles principales:
- Contexto (Context): Mantiene una referencia al objeto de estrategia y se encarga de delegar las solicitudes del cliente al objeto de estrategia concreto para que las ejecute. La clase de contexto puede obtener el objeto de estrategia concreto mediante inyección de dependencias, una fábrica simple, entre otros métodos.
- Estrategia abstracta (Abstract Strategy): Define la interfaz pública o la clase abstracta del objeto de estrategia y establece los métodos que las clases de estrategia concretas deben implementar.
- Estrategia concreta (Concrete Strategy): Implementa la interfaz o la clase abstracta definida por la estrategia abstracta y contiene la implementación específica del algoritmo.
El patrón de estrategia, al desacoplar el algoritmo del código que lo utiliza, ofrece un método para seleccionar dinámicamente diferentes algoritmos. El código del cliente no necesita conocer los detalles específicos del algoritmo; en su lugar, utiliza la estrategia seleccionada mediante la invocación de la clase de contexto.
Implementación
Vamos a crear una interfaz que defina la actividadStrategyy las clases de estrategia concretas que implementan laStrategyinterfaz.Contextes una clase que utiliza una determinada estrategia.
StrategyPatternDemo, nuestra clase de demostración utilizaContexty el objeto de estrategia para demostrar el cambio de comportamiento de Context cuando cambia la estrategia que tiene configurada o utiliza.
Paso 1
Crear una interfaz.
Strategy.java
Paso 2
Crear las clases concretas que implementan la interfaz.
OperationAdd.java
OperationSubtract.java
OperationMultiply.java
Paso 3
CrearContextla clase.
Context.java
Paso 4
UsarContextpara ver el cambio de comportamiento cuando cambia la estrategiaStrategy.
StrategyPatternDemo.java
Paso 5
Ejecutar el programa, el resultado es:
10 + 5 = 15 10 - 5 = 5 10 * 5 = 50Otras extensiones