Que patrón emplear el Strategy o el Template Method

COMPARTIR 0 TWITTEAR

solucion_strategy

Siguiendo nuestro curso de programación hoy veremos una comparación entre los patrones Template Method y el Strategy. Partiremos del código que ya habíamos codificado mediante el patrón Template Method para ver como sería su codificación con el patrón Strategy y responder así las preguntas que habíamos planteado al final del artículo anterior.

Diferencias en la implementación

Tenemos que tener clara la estructura fundamental de cada patrón y como funciona:

  • Con el patrón Template Method se crea una subclase por cada implementación distinta y en ella se implementan los métodos.

  • Con el patrón Strategy se crea una clase estrategia. En una clase se crea una instancia de estrategia y luego se crea una subclase de estrategia por cada implementación distinta.

Soluciones planteadas

Veamos los diagramas UML que obtenemos con cada solución.

Template Method

uml_ejemplo_template_method

Strategy

solucion_strategy

Código Strategy

Tenemos que declarar una clase que implemente la funcionalidad básica del juego mediante el uso de una plataforma:

public class BallGameStrategy {

private Platform platform;
private Image2D image;

public void play(Platform p) {

    platform = p;
    image = platform.load("Bola.jpg");

    // Lógica principal del juego
    for (int i = 0; i < 10; i++) {
        Point point = platform.getClick();
        platform.paint(point.x, point.y, image);
    }
}
}

Tendremos que definir una clase abstracta Plataform que defina los métodos que se deben proporcionar:

public abstract class Platform {

public abstract Image2D load(String name);

public abstract void paint(int x, int y, Image2D image);

public abstract Point getClick();

}

Y tendremos una subclase de la plataforma por cada una de las API, por ejemplo la de Android sería:

public class PlatformAndroid extends Platform{

private AndroidAPI e = new AndroidAPI();

@Override
public Image2D load(String name) {
    return e.loadResource(name);
}

@Override
public void paint(int x, int y, Image2D image) {
    e.draw(x, y, image);
}

@Override
public Point getClick() {
    return e.getTouch();
}
}

Lanzando la aplicación

Dependiendo de que patrón decidamos utilizar la forma de instanciar las clases será diferente:

public class Main {
public static void main(String[] args) {        

            // patrón Template Method
    BallGameTemplateMethod game = new BallGameWindows();
    game.play();
    game = new BallGameAndroid();
    game.play();
    game = new BallGamePlaystation();
    game.play();

            // patrón Strategy
    BallGameStrategy game2 = new BallGameStrategy();
    game2.play(new PlatformWindows());
    game2.play(new PlatformAndroid());
    game2.play(new PlatformPlaystation5());
}
}

¿Qué patrón escoger?

No siempre está claro. Ambas soluciones sirven, solventan el problema pero quizás el utilizar el patrón Strategy nos permita, en un nivel más alto del diseño solucionar problemas que puedan llegar a plantearse, como por ejemplo: ¿Qué pasaría si tenemos otro tipo de juego?

Con el Template Method tendríamos que realizar otra clase plantilla y llegaremos a una duplicación del código inevitable, planteándolo como una estrategia simplemente tendríamos que definir otra clase similar a BallGameStrategy.

En este caso si que podríamos decantarnos por utilizar una estrategia, pero es muy difícil llegar a una abstracción de forma tan inmediata y casi por la naturaleza del problema planteado nos damos cuenta que quizás no sea necesaria llegar a un nivel tan alto de abstracción como el que hemos llegado a plantear con el patrón Strategy. En este caso, y en muchos otros casos, la práctica y la interacción del usuario, y las necesidades que este vaya adquiriendo, serán las que decidan si el modelo escogido ha sido el correcto o no.

Como siempre os dejo el código empleado.

Archivado en Curso de Programación, Java, Patrones de diseño
COMPARTIR 0 TWITTEAR

Comentarios (19)

Usa tu cuenta de Facebook para dejar tu opinión.

¿Te ha gustado? ¡No te pierdas nada más!

follow us in feedly

Otras webs de Difoosion