21 mar 2013

Solucion 11 - Patron de diseño Strategy

Lo patrones de diseño son la evolución natural y sofisticada de la programación orientada a objeto (OO), son técnicas para aprovechar al máximo el potencial de la OO. Soluciones optimas que en caso de usarlas de forma adecuada darán un valor añadido a nuestros algoritmos  facilitando en el futuro las tareas mantenimiento y extensión de la misma.

Empezaremos con el patrón de diseño Strategy.

Definición Wikipedia: 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. 

Dada una clase llamada Strategy tenemos dos clases hijas que tienen un método strategicMethod() cada una con diferentes implementaciones, caso claro de Polimorfismo. Después desde la clase Context podremos escoger en setStrategy() que clase hija y implementacion nos interesa más. Al instanciar en Context la clase hija que queramos, la ConcreteStrategy escogida, dispondremos de sus funcionalidades. También cabe destacar la posibilidad de cambiar cuando queramos de estrategia instanciando en Context otra ConcreteSrategy.


Ejemplo:
public class CreadorDibujos {
    private EstrategiaDibujo _estrategia;
    private float[] _x,_y;
 
    public CreadorDibujos() {
        // Establecer estrategia por defecto.
    }
 
    public void establecerDibujoBarras() {
        _estrategia = new EstrategiaDibujoConcreta1();
    }
 
    public void establecerDibujoLineas() {
        _estrategia = new EstrategiaDibujoConcreta2();
    }
 
    ..............
 
    public void dibuja() {
        _estrategia.dibujar(_x,_y);
    }
}
La clase Context seria CreadorDibujos, y dependiendo si escogemos Barras o Lineas, la implementación del método dibuja() cambiará. Se podría por ejemplo añadir nuevas estrategias como Círculos  Cuadrados, Rombos, etc. y de manera rápida y eficiente con pocos cambios en el sistema creado realizar cambios consistentes.
public abstract class EstrategiaDibujo extends JFrame {
    private float[] _x,_y;
    private Color _c;
    private int _ancho,_alto;
 
    public EstrategiaDibujo() {
    }
 
    public abstract void dibujar(float[] px, float[] py);
}

public class EstrategiaDibujoConcreta1 extends EstrategiaDibujo{
        //...
        public void dibujar(float[] px, float[] py){ ... }
        //...
}

public class EstrategiaDibujoConcreta2 extends EstrategiaDibujo{
        //...
        public void dibujar(float[] px, float[] py){ ... }
        //...
}