terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat strategy.md
guest@codeandosimple: ~/blog/design-patterns $ cat strategy.md

Strategy Pattern_

// "No olvides que cada libro, cada clase, cada desafío es una puerta hacia el conocimiento y la comprensión" - José Luis Sampedro

# Propósito

El patrón Strategy define una familia de algoritmos, encapsula cada uno de ellos y los hace intercambiables. Permite que el algoritmo varíe independientemente de los clientes que lo usan.

# Problema

  • Acoplamiento Rígido: Mezclar la lógica de negocio con múltiples implementaciones de algoritmos.

  • Estatismo: Imposibilidad de cambiar el comportamiento en tiempo de ejecución de forma limpia.

# Solución

Encapsular cada algoritmo en su propia clase (estrategia concreta) y delegar su ejecución desde la clase principal (contexto).

# Estructura

Estructura UML Strategy

# Participantes

  • Context: Mantiene la referencia a la estrategia elegida.
  • Strategy (Interface): Interfaz común para todos los algoritmos.
  • ConcreteStrategy: Implementación específica del algoritmo.

# Cuándo Usarlo

Cuando tienes múltiples formas de realizar una tarea y quieres poder intercambiarlas dinámicamente sin llenar el código de if/else.

# Ventajas

  • verified

    Flexibilidad: Cambio de algoritmo en caliente.

  • verified

    Aislamiento: La lógica compleja del algoritmo no ensucia la clase Contexto.

# Desventajas

  • warning

    Costo de Comunicación: Overhead al pasar datos entre Contexto y Estrategia.

  • warning

    Visibilidad: Los clientes deben conocer qué estrategias existen para elegirlas.

# Ejemplo: Sistema de Navegación

Cálculo de rutas: Rápida, Corta o Escénica. Cada una es una estrategia distinta que el usuario selecciona.

Ejemplo Strategy Rutas

# Código Java

interface RouteStrategy { void build(String a, String b); }

class FastestRoute implements RouteStrategy {
    public void build(String a, String b) { 
        System.out.println("Ruta rápida");
    }
}

class NavigationSystem {
    private RouteStrategy s;
    public void setStrategy(RouteStrategy s) { this.s = s; }
    public void navigate(String a, String b) { s.build(a, b); }
}

# Mapeo Participantes

  • RouteStrategy: Strategy Interface.
  • FastestRoute/ScenicRoute: ConcreteStrategies.
  • NavigationSystem: Context.

# Conclusiones

Convierte a los algoritmos en bloques de construcción modulares y fáciles de testear de forma aislada.

# Patrones relacionados

Flyweight

Las estrategias concretas pueden ser compartidas si no guardan estado.

State

Ambos usan delegación, pero Strategy es una elección puntual del cliente.