Menu
Coddy logo textTech

Patrón Strategy

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 93 de 110.

El patrón Strategy te permite definir una familia de algoritmos, encapsular cada uno en su propia clase y hacer que sean intercambiables en tiempo de ejecución. En lugar de codificar el comportamiento directamente en una clase, inyectas el comportamiento mediante una interfaz, lo que te permite cambiar de estrategia sin modificar la clase que las utiliza.

Considere un sistema de pago en el que desee admitir diferentes métodos de pago. En lugar de utilizar condicionales para manejar cada método, se define una interfaz de estrategia y se crean implementaciones concretas:

abstract class PaymentStrategy {
  void pay(double amount);
}

class CreditCardPayment implements PaymentStrategy {
  @override
  void pay(double amount) => print('Paid \$$amount with Credit Card');
}

class PayPalPayment implements PaymentStrategy {
  @override
  void pay(double amount) => print('Paid \$$amount with PayPal');
}

class ShoppingCart {
  PaymentStrategy _paymentStrategy;

  ShoppingCart(this._paymentStrategy);

  void setPaymentStrategy(PaymentStrategy strategy) {
    _paymentStrategy = strategy;
  }

  void checkout(double total) {
    _paymentStrategy.pay(total);
  }
}

void main() {
  var cart = ShoppingCart(CreditCardPayment());
  cart.checkout(99.99);  // Paid $99.99 with Credit Card

  cart.setPaymentStrategy(PayPalPayment());
  cart.checkout(49.99);  // Paid $49.99 with PayPal
}

El ShoppingCart no sabe ni le importa cómo funciona el pago; simplemente delega en cualquier estrategia que esté configurada actualmente. Puedes añadir nuevos métodos de pago creando nuevas clases de estrategia sin tocar el código del carrito. Este patrón es ideal cuando tienes múltiples formas de realizar una acción y quieres seleccionar o cambiar entre ellas dinámicamente.

challenge icon

Desafío

Fácil

¡Construyamos un sistema de formato de texto usando el patrón Strategy! Crearás un sistema en el que se puedan aplicar distintas estrategias de formato al texto, lo que permitirá a los usuarios cambiar entre formatos dinámicamente sin modificar el procesador de texto principal.

Organizarás tu código en dos archivos:

  • formatting_strategies.dart: Crea aquí tu sistema de estrategias. Define una clase abstracta FormattingStrategy con un método String format(String text). Después, implementa tres estrategias concretas:
    • UppercaseStrategy: convierte el texto completamente a mayúsculas
    • LowercaseStrategy: convierte el texto completamente a minúsculas
    • TitleCaseStrategy: escribe en mayúscula la primera letra de cada palabra (separa por espacios, escribe en mayúscula el primer carácter de cada palabra y el resto en minúsculas)
    Crea también una clase TextProcessor que contenga una FormattingStrategy. Debe tener un constructor que acepte una estrategia inicial, un método setStrategy() para cambiar la estrategia en tiempo de ejecución y un método process(String text) que aplique la estrategia actual y devuelva el resultado formateado.
  • main.dart: Importa tus estrategias de formato y demuestra cómo el patrón Strategy permite cambiar el comportamiento dinámicamente. Crea un TextProcessor que comience con UppercaseStrategy. Procesa el texto hello world e imprime el resultado. Después, cambia a LowercaseStrategy, procesa HELLO WORLD e imprime el resultado. Por último, cambia a TitleCaseStrategy, procesa the quick brown fox e imprime el resultado.

Esto demuestra el poder del patrón Strategy: tu TextProcessor no necesita conocer los detalles de cómo funciona el formato. Simplemente delega en la estrategia que esté configurada actualmente, lo que facilita añadir nuevas opciones de formato sin modificar el procesador.

Salida esperada:

HELLO WORLD
hello world
The Quick Brown Fox

Pruébalo tú mismo

import 'formatting_strategies.dart';

void main() {
  // TODO: Crear un TextProcessor comenzando con UppercaseStrategy
  
  // TODO: Procesar el texto 'hello world' e imprimir el resultado
  
  // TODO: Cambiar a LowercaseStrategy
  
  // TODO: Procesar 'HELLO WORLD' e imprimir el resultado
  
  // TODO: Cambiar a TitleCaseStrategy
  
  // TODO: Procesar 'the quick brown fox' e imprimir el resultado
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online