Menu
Coddy logo textTech

Strategy

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 93 di 110.

Il pattern Strategy ti permette di definire una famiglia di algoritmi, incapsulare ciascuno nella propria classe e renderli intercambiabili durante l'esecuzione. Invece di codificare direttamente il comportamento in una classe, lo inietti tramite un'interfaccia, potendo così sostituire le strategie senza modificare la classe che le utilizza.

Considera un sistema di pagamento in cui vuoi supportare diversi metodi di pagamento. Invece di usare condizioni per gestire ogni metodo, definisci un'interfaccia strategia e crea implementazioni concrete:

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);  // Pagato $99.99 con carta di credito

  cart.setPaymentStrategy(PayPalPayment());
  cart.checkout(49.99);  // Pagato $49.99 con PayPal
}

ShoppingCart non sa né gli importa come funziona il pagamento: delega semplicemente alla strategia attualmente impostata. Puoi aggiungere nuovi metodi di pagamento creando nuove classi strategia senza modificare il codice del carrello. Questo schema è ideale quando hai diversi modi per eseguire un’azione e vuoi selezionare o alternare tra essi dinamicamente.

challenge icon

Sfida

Facile

Costruiamo un sistema di formattazione del testo usando il pattern Strategy! Creerai un sistema in cui è possibile applicare diverse strategie di formattazione al testo, consentendo agli utenti di passare dinamicamente da un formato all'altro senza modificare il processore di testo principale.

Organizzerai il codice in due file:

  • formatting_strategies.dart: crea qui il tuo sistema di strategie. Definisci una classe astratta FormattingStrategy con un metodo String format(String text). Poi implementa tre strategie concrete:
    • UppercaseStrategy - converte il testo tutto in maiuscolo
    • LowercaseStrategy - converte il testo tutto in minuscolo
    • TitleCaseStrategy - mette in maiuscolo la prima lettera di ogni parola (suddividi in base agli spazi, metti in maiuscolo il primo carattere di ogni parola e lascia il resto in minuscolo)
    Crea anche una classe TextProcessor che contiene una FormattingStrategy. Dovrebbe avere un costruttore che accetta una strategia iniziale, un metodo setStrategy() per cambiare la strategia durante l'esecuzione e un metodo process(String text) che applica la strategia corrente e restituisce il risultato formattato.
  • main.dart: importa le tue strategie di formattazione e dimostra come il pattern Strategy consenta di cambiare dinamicamente il comportamento. Crea un TextProcessor che inizi con UppercaseStrategy. Elabora il testo hello world e stampa il risultato. Poi passa a LowercaseStrategy, elabora HELLO WORLD e stampa il risultato. Infine, passa a TitleCaseStrategy, elabora the quick brown fox e stampa il risultato.

Questo dimostra la potenza del pattern Strategy: il tuo TextProcessor non deve conoscere i dettagli di come funziona la formattazione. Si limita a delegare alla strategia impostata al momento, rendendo semplice aggiungere nuove opzioni di formattazione senza modificare il processore!

Output previsto:

HELLO WORLD
hello world
The Quick Brown Fox

Provalo tu

import 'formatting_strategies.dart';

void main() {
  // TODO: Crea un TextProcessor iniziando con UppercaseStrategy
  
  // TODO: Elabora il testo 'hello world' e stampa il risultato
  
  // TODO: Passa a LowercaseStrategy
  
  // TODO: Elabora 'HELLO WORLD' e stampa il risultato
  
  // TODO: Passa a TitleCaseStrategy
  
  // TODO: Elabora 'the quick brown fox' e stampa il risultato
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online