Strategy-mønsteret: udskiftelige algoritmer
Indkapsl sorterings- eller betalingsalgoritmer bag et Strategy-interface, så de kan skiftes under kørsel.
Strategy-mønsteret: udskiftelige algoritmer er en gratis Java Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Java Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Java Academy-kurset indeholder 4 lektioner i alt.
Strategy-mønsterets formål
Strategy definerer en familie af algoritmer, indkapsler hver enkelt og gør dem udskiftelige. Det lader algoritmen variere uafhængigt af den kontekst, der bruger den.
Problemet uden Strategy
Uden Strategy er valget af algoritme skjult i kæder af if-else. Hvis du tilføjer en ny algoritme, skal du redigere kontekstklassen — hvilket overtræder åben/lukket-princippet.
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-grænsefladen
Definér en @FunctionalInterface eller en almindelig grænseflade, der repræsenterer algoritmens kontrakt. Hver implementering indkapsler en forskellig 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); }
}Kontekstklasse
Konteksten indeholder en reference til en strategi og overlader udførelsen af algoritmen til den. Strategien kan udskiftes under kørsel.
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); }
}Skift af strategier under kørsel
Skift strategi undervejs uden at ændre konteksten. Det gør det muligt at konfigurere adfærden uden for 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-grænsefladen er en @FunctionalInterface, kan du bruge lambdaer direkte — der er ikke behov for eksplicitte klasser til simple strategier.
Sorter sorter = new Sorter(data -> Collections.sort(data)); // lambda strategy
// or method reference:
Sorter sorter2 = new Sorter(Collections::sort);Strategy til betalingsbehandling
Et klassisk eksempel fra den virkelige verden: En betalingskontekst accepterer forskellige betalingsstrategier (kreditkort, PayPal eller kryptovaluta) uden at kende detaljerne i hver enkelt.
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 til komprimering
En filbehandler kan bruge en CompressionStrategy. Tilslut GZIP, ZIP eller LZ4 uden at ændre filbehandlingsforløbet.
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]; }
}Kombination af Strategy og fabrik
Brug en fabrik til at vælge strategien ud fra konfigurationen, så valgslogikken holdes adskilt fra både konteksten og selve strategierne.
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 bruger nedarvning: Skelettet findes i basisklassen, og underklasserne tilsidesætter trinene. Strategy bruger komposition: Algoritmen er helt ekstern. Foretræk Strategy for større fleksibilitet.
Strategimønstret i JDK'et
Comparator er det klassiske strategimønster i JDK'et. Send forskellige sammenlignere til Collections.sort for at ændre sorteringsalgoritmen uden at ændre samlingskoden.
List<String> names = List.of("Bob", "Alice", "Charlie");
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);Test af strategier
Strategier er nemme at teste isoleret – kald blot strategy.sort(data) i en enhedstest. Indsæt mock-strategier i konteksten for at teste kontekstens koordinationslogik.
Hurtigt tjek
Hvad er den vigtigste strukturelle forskel mellem strategimønstret og skabelonmetoden?
Opsummering
Strategimønstret indkapsler udskiftelige algoritmer bag en fælles grænseflade. Brug lambdaer til simple strategier og klasser til komplekse strategier. Kombinér dem med fabrikker for konfigurationsstyret valg.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 104
- Lektioner
- 374
Ofte stillede spørgsmål
Er lektionen “Strategy-mønsteret: udskiftelige algoritmer” gratis?
Ja — hele teksten til “Strategy-mønsteret: udskiftelige algoritmer” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Java Academy-kurset, skal du opgradere til CoddyKit PRO. Java Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Strategy-mønsteret: udskiftelige algoritmer”?
Indkapsl sorterings- eller betalingsalgoritmer bag et Strategy-interface, så de kan skiftes under kørsel. Du øver dig i Java Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Java Academy?
Der kræves ingen tidligere erfaring. Java Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Strategy-mønsteret: udskiftelige algoritmer”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Java Academy-lektion?
Ja. Alle Java Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Observer-mønsteret: hændelsesnotifikation
- Strategy-mønsteret: udskiftelige algoritmer
- Command-mønsteret: indkapsling af handlinger
- Template Method: definition af algoritmeskeletter