Strategy-mønsteret: utskiftbare algoritmer
Kapsle inn sorterings- eller betalingsalgoritmer bak et Strategy-grensesnitt for bytte under kjøring.
Strategy-mønsteret: utskiftbare algoritmer er en gratis leksjon i Java Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Java Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hensikten med Strategy
Strategy definerer en familie av algoritmer, kapsler inn hver av dem og gjør dem utbyttbare. Dermed kan algoritmen variere uavhengig av konteksten som bruker den.
Problemet uten Strategy
Uten Strategy er valget av algoritme skjult i if-else-kjeder. Når en ny algoritme skal legges til, må kontekstklassen redigeres — et brudd på Open/Closed-prinsippet.
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
}Strategy-grensesnittet
Definer en @FunctionalInterface eller et vanlig grensesnitt som representerer algoritmekontrakten. Hver implementasjon kapsler inn en annen algoritme.
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); }
}Kontekstklassen
Konteksten inneholder en referanse til en strategi og delegerer kjøringen av algoritmen til den. Strategien kan byttes ved kjøring.
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); }
}Bytte strategi ved kjøring
Bytt strategi underveis uten å endre konteksten. Dermed kan oppførselen konfigureres utenfra klassen.
Sorter sorter = new Sorter(new BubbleSortStrategy());
sorter.sort(data); // uses bubble sort
sorter.setStrategy(new QuickSortStrategy());
sorter.sort(data); // now uses quick sortLambda-strategier
Når strategi-grensesnittet er et @FunctionalInterface, kan man bruke lambdaer direkte. Det er ikke nødvendig å opprette eksplisitte klasser for enkle strategier.
Sorter sorter = new Sorter(data -> Collections.sort(data)); // lambda strategy
// or method reference:
Sorter sorter2 = new Sorter(Collections::sort);Strategy for betalingsbehandling
Et klassisk eksempel fra virkeligheten: En betalingskontekst tar imot ulike betalingsstrategier, for eksempel kredittkort, PayPal eller kryptovaluta, uten å kjenne detaljene i hver av dem.
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 for komprimering
En filbehandler kan bruke en CompressionStrategy. Koble inn GZIP, ZIP eller LZ4 uten å endre pipelinen for filbehandlingen.
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]; }
}Kombinere Strategy med Factory
Bruk en fabrikk til å velge strategi basert på konfigurasjon. Da holdes valgregelen atskilt fra både konteksten og strategiene.
SortStrategy strategy = switch (config.getSortMethod()) {
case "bubble" -> new BubbleSortStrategy();
case "merge" -> new MergeSortStrategy();
default -> Collections::sort;
};
new Sorter(strategy).sort(data);Strategy kontra Template Method
Template Method bruker arv: Skjelettet ligger i basisklassen, og underklassene overstyrer trinnene. Strategy bruker komposisjon: Algoritmen er fullstendig ekstern. Foretrekk Strategy for større fleksibilitet.
Strategy i JDK
Comparator er den klassiske Strategy-implementasjonen i JDK. Send ulike komparatorer til Collections.sort for å endre sorteringsalgoritmen uten å berøre samlingskoden.
List<String> names = List.of("Bob", "Alice", "Charlie");
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);Testing av strategier
Strategier er enkle å teste isolert – kall bare strategy.sort(data) i en enhetstest. Injiser mock-strategier i konteksten for å teste orkestreringslogikken i konteksten.
Hurtigsjekk
Hva er den viktigste strukturelle forskjellen mellom Strategy og Template Method?
Oppsummering
Strategy kapsler inn utskiftbare algoritmer bak et felles grensesnitt. Bruk lambdauttrykk for enkle strategier og klasser for komplekse strategier. Kombiner med fabrikkmønstre for konfigurasjonsstyrt valg.
Lær deg Java med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 104
- Leksjoner
- 374
Ofte stilte spørsmål
Er leksjonen «Strategy-mønsteret: utskiftbare algoritmer» gratis?
Ja – hele teksten i «Strategy-mønsteret: utskiftbare algoritmer» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Java Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Java Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Strategy-mønsteret: utskiftbare algoritmer»?
Kapsle inn sorterings- eller betalingsalgoritmer bak et Strategy-grensesnitt for bytte under kjøring. Du øver på Java Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Java Academy?
Ingen tidligere erfaring er nødvendig. Java Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Strategy-mønsteret: utskiftbare algoritmer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Java Academy-leksjonen?
Ja. Alle Java Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Observer-mønsteret: hendelsesvarsling
- Strategy-mønsteret: utskiftbare algoritmer
- Command-mønsteret: kapsle inn handlinger
- Template Method: definere algoritmeskjeletter