Pattern Strategy: algoritmi intercambiabili
Incapsuli algoritmi di ordinamento o pagamento dietro un'interfaccia Strategy per poterli sostituire a runtime.
Pattern Strategy: algoritmi intercambiabili è una lezione Java Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Java Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Java Academy include 4 lezioni in totale.
Intento di Strategy
Strategy definisce una famiglia di algoritmi, incapsula ciascun algoritmo e li rende intercambiabili. Consente all'algoritmo di variare indipendentemente dal contesto che lo utilizza.
Il problema senza Strategy
Senza Strategy, la selezione dell'algoritmo è nascosta in catene di if-else. Aggiungere un nuovo algoritmo significa modificare la classe di contesto, violando il principio Open/Closed.
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
}Interfaccia di Strategy
Definisca una @FunctionalInterface o un'interfaccia ordinaria che rappresenti il contratto dell'algoritmo. Ogni implementazione incapsula un algoritmo diverso.
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); }
}Classe di contesto
Il contesto mantiene un riferimento a una strategia e delega a essa l'esecuzione dell'algoritmo. La strategia può essere sostituita a runtime.
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); }
}Cambiare strategia a runtime
Cambi la strategia al volo senza modificare il contesto. In questo modo il comportamento può essere configurato dall'esterno della classe.
Sorter sorter = new Sorter(new BubbleSortStrategy());
sorter.sort(data); // uses bubble sort
sorter.setStrategy(new QuickSortStrategy());
sorter.sort(data); // now uses quick sortStrategie con lambda
Quando l'interfaccia della strategia è una @FunctionalInterface, utilizzi direttamente le lambda: per le strategie semplici non sono necessarie classi esplicite.
Sorter sorter = new Sorter(data -> Collections.sort(data)); // lambda strategy
// or method reference:
Sorter sorter2 = new Sorter(Collections::sort);Strategy per l'elaborazione dei pagamenti
Un classico utilizzo reale: un contesto di pagamento accetta diverse strategie di pagamento, come carta di credito, PayPal o criptovaluta, senza conoscerne i dettagli.
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 per la compressione
Un processore di file può utilizzare una CompressionStrategy. Colleghi GZIP, ZIP o LZ4 senza modificare la pipeline di elaborazione dei file.
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]; }
}Combinare Strategy con Factory
Utilizzi una factory per selezionare la strategia in base alla configurazione, mantenendo la logica di selezione separata sia dal contesto sia dalle strategie stesse.
SortStrategy strategy = switch (config.getSortMethod()) {
case "bubble" -> new BubbleSortStrategy();
case "merge" -> new MergeSortStrategy();
default -> Collections::sort;
};
new Sorter(strategy).sort(data);Strategy e Template Method
Template Method utilizza l'ereditarietà: lo scheletro si trova nella classe base e le sottoclassi sovrascrivono i vari passaggi. Strategy utilizza la composizione: l'algoritmo è completamente esterno. Preferisca Strategy per una maggiore flessibilità.
Strategy nel JDK
Comparator è l'implementazione canonica di Strategy nel JDK. Passi comparatori diversi a Collections.sort per modificare l'algoritmo di ordinamento senza toccare il codice della collezione.
List<String> names = List.of("Bob", "Alice", "Charlie");
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);Test delle strategie
Le strategie sono facili da testare in isolamento: è sufficiente chiamare strategy.sort(data) in un test unitario. Inietti strategie mock nel contesto per testare la logica di orchestrazione del contesto.
Verifica rapida
Qual è la principale differenza strutturale tra Strategy e Template Method?
Riepilogo
Strategy incapsula algoritmi intercambiabili dietro un'interfaccia comune. Utilizzi le lambda per le strategie semplici e le classi per quelle complesse. Lo combini con le factory per una selezione guidata dalla configurazione.
Domande Frequenti
La lezione «Pattern Strategy: algoritmi intercambiabili» è gratuita?
Sì — il testo completo di «Pattern Strategy: algoritmi intercambiabili» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Java Academy, passa a CoddyKit PRO. Il corso Java Academy include 4 lezioni in totale.
Cosa imparerò in «Pattern Strategy: algoritmi intercambiabili»?
Incapsuli algoritmi di ordinamento o pagamento dietro un'interfaccia Strategy per poterli sostituire a runtime. Eserciti Java Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Java Academy?
Non è richiesta alcuna esperienza precedente. Java Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Pattern Strategy: algoritmi intercambiabili»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Java Academy?
Sì. Ogni lezione Java Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Pattern Observer: notifica degli eventi
- Pattern Strategy: algoritmi intercambiabili
- Pattern Command: incapsulare le azioni
- Template Method: definire scheletri di algoritmi