El patrón Strategy define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que el cliente pueda elegir el algoritmo apropiado en tiempo de ejecución. A continuación, te proporcionaré un ejemplo en Java.
Ejemplo de Strategy en Java:
Supongamos que tienes una interfaz Estrategia
que define un método realizarOperacion()
:
// Interfaz Estrategia
interface Estrategia {
int realizarOperacion(int num1, int num2);
}
Ahora, creas implementaciones concretas de Estrategia
, por ejemplo, EstrategiaSuma
y EstrategiaResta
:
// EstrategiaSuma
class EstrategiaSuma implements Estrategia {
@Override
public int realizarOperacion(int num1, int num2) {
return num1 + num2;
}
}
// EstrategiaResta
class EstrategiaResta implements Estrategia {
@Override
public int realizarOperacion(int num1, int num2) {
return num1 - num2;
}
}
Luego, tienes una clase Contexto
que tiene una referencia a una Estrategia
y un método para ejecutar la operación:
// Contexto
class Contexto {
private Estrategia estrategia;
public Contexto(Estrategia estrategia) {
this.estrategia = estrategia;
}
public int ejecutarEstrategia(int num1, int num2) {
return estrategia.realizarOperacion(num1, num2);
}
}
Ahora puedes usar estos componentes para demostrar el patrón Strategy:
public class Principal {
public static void main(String[] args) {
// Crear contextos con diferentes estrategias
Contexto contextoSuma = new Contexto(new EstrategiaSuma());
Contexto contextoResta = new Contexto(new EstrategiaResta());
// Ejecutar operaciones con diferentes estrategias
System.out.println("Suma: " + contextoSuma.ejecutarEstrategia(5, 3));
System.out.println("Resta: " + contextoResta.ejecutarEstrategia(5, 3));
}
}
Cuándo usar el patrón Strategy:
- Variabilidad de Algoritmos:
- Cuando tienes una familia de algoritmos y necesitas poder intercambiarlos dinámicamente.
- Evitar la Proliferación de Subclases:
- Para evitar la creación de muchas subclases con pequeñas variaciones en su comportamiento.
- Configuración de un Objeto con Diferentes Estrategias:
- Cuando necesitas permitir que un objeto tenga diferentes estrategias y que pueda cambiar entre ellas en tiempo de ejecución.
- Desacoplamiento entre Cliente y Algoritmos:
- Para desacoplar el código cliente del código de implementación de los algoritmos y permitir una fácil extensión.
El patrón Strategy es particularmente útil cuando tienes algoritmos que deben variar en tiempo de ejecución y necesitas una forma de organizar y seleccionar estos algoritmos de manera flexible. Proporciona una alternativa a la herencia para permitir la variabilidad de comportamiento.