martes, 5 de mayo de 2015

Strategy

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