Patrón de Diseño Strategy en Java:

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:

  1. Variabilidad de Algoritmos:
    • Cuando tienes una familia de algoritmos y necesitas poder intercambiarlos dinámicamente.
  2. Evitar la Proliferación de Subclases:
    • Para evitar la creación de muchas subclases con pequeñas variaciones en su comportamiento.
  3. 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.
  4. 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.