Strategy

1 Sinopsis

Encapsula algoritmos relacionados en clases que son subclase de una superclase comun. Esto permite la seleccion del algoritmo que varie por objeto.

2 Contexto

Se necesita hacer una familia de algoritmos de ordenamiento. El cliente debe manejar unicamente el concepto de Ordenador y poder cambiar el algoritmo sin tener que recodificar. Se pueden presentar varios algoritmos de ordenamiento, como quicksort, burbuja, cubeta, etc ... Es decir, por medio de una clase comun, se debe hacer la misma operacion, pero con diferente algoritmo.

3 Solucion

El diagrama UML es el siguiente: Las clases de este diagrama tienen el siguiente papel: Client. Una clase que delega operaciones a una clase abstracta (o tambien puede ser interfase). Sin conocer el tipo concreto de la clase a la que le delega, envia un mensaje pidiendo una operacion. AbstractStrategy. Una clase que provee una manera uniforme de accesar la operacion dada por sus subclases. Se podria usar una interfase si no hay estructuras de datos involucradas. ConcreteStrategy1, ConcreteStrategy2. Clase que implementa la operacion que el cliente necesita delegar. Debe notarse, que entonces, la variacion de la operacion se da por medio de herencia.

4 Consecuencias

Permite que el comportamiento que necesita el cliente, se pueda cambiar de manera dinamica.

5 Ejemplo

El cliente necesita una clase que aplique operaciones aritmeticas. Debe invocar un metodo operar, indicando dos operandos. La clase Operacion, es una clase abstracta que define solo el metodo operar, y dos metodos, getResultado y setResultado, encapsulando en una propiedad entera el resultado de la operacion.


public abstract class Operacion  {
    ....
}
See the complete code for Operacion here.
   private int _resultado;
   public int getResultado() { return _resultado;}
   public void setResultado(int r) { _resultado = r;}
   public abstract void operar(int op1,int op2) ;

La estrategia concreta que aterriza el metodo operar es una que suma, la clase es Suma y extiende a la clase Operacion


public class Suma extends Operacion  {
    ....
}
See the complete code for Suma here.
  public void operar(int op1,int op2) { super.setResultado(op1+op2);}

public class Resta extends Operacion  {
    ....
}
See the complete code for Resta here.
  public void operar(int op1,int op2) { super.setResultado(op1-op2);}

public class Producto extends Operacion  {
    ....
}
See the complete code for Producto here.
  public void operar(int op1,int op2) { super.setResultado(op1*op2);}

public class Division extends Operacion  {
    ....
}
See the complete code for Division here.
  public void operar(int op1,int op2) { super.setResultado(op1/op2);}

La clase cliente utiliza una operacion, y almacena en una tabla Hash cada objeto.


public class ClientStrategy  {
    ....
}
See the complete code for ClientStrategy here.
 public final static String SUMA="SUMA";
 public final static String RESTA="RESTA";
 public final static String PRODUCTO="PRODUCTO";
 public final static String DIVISION="DIVISION";
 public static void main(String [] args) {
    java.util.Hashtable hsh = new java.util.Hashtable();
    hsh.put(SUMA,new Suma());
    hsh.put(RESTA,new Resta());
    hsh.put(PRODUCTO,new Producto());
    hsh.put(DIVISION,new Division());
    int op1=1,op2=2;
    String cmd = args[0];
    Operacion oper;
    oper = (Operacion) hsh.get(args[0]);
    oper.operar(op1,op2);
    System.out.println(oper.getResultado());
 }