0Pricing
Java Academy · Lección

Patrón Strategy: algoritmos intercambiables

Encapsule algoritmos de ordenación o de pago tras una interfaz Strategy para poder cambiarlos en tiempo de ejecución.

Patrón Strategy: algoritmos intercambiables es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

Propósito de Strategy

Strategy define una familia de algoritmos, encapsula cada uno de ellos y permite intercambiarlos. Permite que el algoritmo varíe de forma independiente del contexto que lo utiliza.

El problema sin Strategy

Sin Strategy, la selección del algoritmo queda oculta en cadenas de if-else. Añadir un algoritmo nuevo implica editar la clase de contexto, lo que infringe el principio abierto/cerrado.

public double sort(List<Integer> data, String method) {
    if (method.equals("bubble")) { /* bubble sort */ }
    else if (method.equals("merge")) { /* merge sort */ }
    // adding quicksort requires editing this class
}

Interfaz de Strategy

Defina una @FunctionalInterface o una interfaz normal que represente el contrato del algoritmo. Cada implementación encapsula un algoritmo diferente.

public interface SortStrategy {
    void sort(List<Integer> data);
}
public class BubbleSortStrategy implements SortStrategy {
    public void sort(List<Integer> data) { /* bubble sort logic */ }
}
public class QuickSortStrategy implements SortStrategy {
    public void sort(List<Integer> data) { Collections.sort(data); }
}

Clase de contexto

El contexto mantiene una referencia a una estrategia y delega en ella la ejecución del algoritmo. La estrategia puede cambiarse en tiempo de ejecución.

public class Sorter {
    private SortStrategy strategy;
    public Sorter(SortStrategy strategy) { this.strategy = strategy; }
    public void setStrategy(SortStrategy s) { this.strategy = s; }
    public void sort(List<Integer> data)   { strategy.sort(data); }
}

Cambiar de estrategia en tiempo de ejecución

Cambie la estrategia sobre la marcha sin modificar el contexto. Esto permite configurar el comportamiento desde fuera de la clase.

Sorter sorter = new Sorter(new BubbleSortStrategy());
sorter.sort(data);                          // uses bubble sort
sorter.setStrategy(new QuickSortStrategy());
sorter.sort(data);                          // now uses quick sort

Estrategias con lambdas

Cuando la interfaz de estrategia es una @FunctionalInterface, utilice lambdas directamente; no se necesitan clases explícitas para las estrategias sencillas.

Sorter sorter = new Sorter(data -> Collections.sort(data)); // lambda strategy
// or method reference:
Sorter sorter2 = new Sorter(Collections::sort);

Strategy para el procesamiento de pagos

Un uso clásico en el mundo real: un contexto de pagos acepta distintas estrategias de pago (tarjeta de crédito, PayPal o criptomonedas) sin conocer los detalles de cada una.

public interface PaymentStrategy {
    void pay(double amount);
}
new PaymentProcessor(new CreditCardStrategy("4111...")).pay(99.99);
new PaymentProcessor(new PayPalStrategy("user@email.com")).pay(99.99);

Strategy para la compresión

Un procesador de archivos puede utilizar una CompressionStrategy. Integre GZIP, ZIP o LZ4 sin cambiar la canalización de procesamiento de archivos.

public interface CompressionStrategy {
    byte[] compress(byte[] data) throws IOException;
}
public class GzipStrategy implements CompressionStrategy {
    public byte[] compress(byte[] data) throws IOException { /* gzip */ return new byte[0]; }
}

Combinar Strategy con Factory

Utilice una fábrica para seleccionar la estrategia según la configuración, manteniendo la lógica de selección separada tanto del contexto como de las propias estrategias.

SortStrategy strategy = switch (config.getSortMethod()) {
    case "bubble" -> new BubbleSortStrategy();
    case "merge"  -> new MergeSortStrategy();
    default       -> Collections::sort;
};
new Sorter(strategy).sort(data);

Strategy frente a Template Method

Template Method utiliza herencia: la estructura se encuentra en la clase base y las subclases sobrescriben los pasos. Strategy utiliza composición: el algoritmo es completamente externo. Prefiera Strategy para obtener una mayor flexibilidad.

Strategy en el JDK

Comparator es el Strategy canónico del JDK. Pase distintos comparadores a Collections.sort para cambiar el algoritmo de ordenación sin modificar el código de la colección.

List<String> names = List.of("Bob", "Alice", "Charlie");
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);

Pruebas de Strategies

Los Strategies son fáciles de probar de forma aislada: basta con llamar a strategy.sort(data) en una prueba unitaria. Inyecte Strategies simulados en el contexto para probar la lógica de coordinación del contexto.

Comprobación rápida

¿Cuál es la diferencia estructural clave entre Strategy y Template Method?

Resumen

Strategy encapsula algoritmos intercambiables detrás de una interfaz común. Utilice lambdas para Strategies sencillos y clases para los complejos. Combínelo con factorías para seleccionar el Strategy según la configuración.

Preguntas frecuentes

¿La lección «Patrón Strategy: algoritmos intercambiables» es gratis?

Sí — el texto completo de «Patrón Strategy: algoritmos intercambiables» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Patrón Strategy: algoritmos intercambiables»?

Encapsule algoritmos de ordenación o de pago tras una interfaz Strategy para poder cambiarlos en tiempo de ejecución. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Patrón Strategy: algoritmos intercambiables»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Patrón Observer: notificación de eventos
  2. Patrón Strategy: algoritmos intercambiables
  3. Patrón Command: encapsulación de acciones
  4. Template Method: definición de esqueletos de algoritmos
← Volver a Java Academy