Strategy
Propósito
Estructurar una familia de algoritmos de modo que sus clientes puedan intercambiarlos en tiempo de ejecución
También conocido como: Policy
Motivación
Permite mantener un conjunto de algoritmos de los que el cliente puede elegir aquel que le convenga e intercambiarlo según sus necesidades; de manera que se puese evitar problemas mediante la definición de las diferentes clases que encapsulan lineas de algoritmos. Un algoritmo que es encapsulado en este camino se llama una Strategy.
Aplicabilidad
Usar este patrón cuando:
- Muchas clases relacionadas difieren sólo en su comportamiento.
- Se necesitan distintas variantes del mismo algoritmo.
- Una clase define muchos comportamientos.
Estructura
Participantes
Strategy:
- Define el comportamiento de la interfaz que es común a todas las implementaciones concretas. El contexto invoca una aplicación específica a través de la interfaz Strategy.
ConcreteStrategy:
- Encapsula una aplicación de un algoritmo específico o comportamiento que se define la estrategia a través de la interfaz.
Context:
- Proporciona ciertos servicios que se define a través de la interfaz y la estrategia aplicada por ConcreteStrategy diferentes clases dependiendo de la conducta. El contexto de clase contiene una referencia a través de la interfaz Strategy a un objeto de ConcreteStrategy.
Client:
- hace uso de la clase de contexto para invocar los diferentes servicios. Dependiendo de la asociación entre el contexto y clases ConcreteStrategy, las distintas implementaciones serán invocadas.
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
El uso del patrón Strategy tiene las siguientes ventajas y desventajas:
- 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.
Implementación
- Conviene analizar si es posible encapsular comportamiento común a todas las estrategias en una superclase.
- El cliente puede pasar la información necesaria al algoritmo o bien pasarse asimismo.
- El cliente puede evitar la creación innecesaria de objetos cuando la estrategia solicitada es idéntica a la última.
Código de ejemplo
public class Main {
public static
void main(String args[])
{
//Usamos
la estrategia A
Strategy
estrategia_inicial = new StrategyA();
Context
context = new Context(estrategia_inicial);
context.some_method();
//Decidimos
usar la estrategia B
Strategy
estrategia2 = new StrategyB();
context.setStrategy(estrategia2);
context.some_method();
//Finalmente,usamos
de nuevo la estrategia A
context.setStrategy(estrategia_inicial);
context.some_method();
/**
Salida:
* Estrategia A
* Estrategia B
**/
}
}
public class Context {
Strategy
c;
public Context(
Strategy c )
{
this.c
= c;
}
public void
setStrategy(Strategy c) {
this.c
= c;
}
//Metodo
de estrategia 'c'
public void
some_method()
{
c.Behaviour();
}
}
public class StrategyA implements Strategy{
@Override
public void
Behaviour() {
System.out.println("Estrategia
A");
}
}
public class StrategyB implements Strategy{
@Override
public void
Behaviour() {
System.out.println("Estrategia
B");
}
}
Usos conocidos
- Método list de la clase File del java.io.
- java.util.zip
Patrones relacionados
TemplateMethod. Una intención similar pero haciendo uso de la herencia en lugar de delegación
Referencias
- Design Patterns Elements of Reusable Object-Oriented Software, GoF. http://www.lsi.us.es/docencia/get.php?id=1378
No hay comentarios:
Publicar un comentario