Wzorzec Strategy: wymienne algorytmy
Hermetyzuj algorytmy sortowania lub płatności za interfejsem Strategy, aby przełączać je w czasie działania programu.
Wzorzec Strategy: wymienne algorytmy to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Cel wzorca Strategy
Strategy definiuje rodzinę algorytmów, hermetyzuje każdy z nich i umożliwia ich wzajemną wymianę. Pozwala zmieniać algorytm niezależnie od kontekstu, który go wykorzystuje.
Problem bez wzorca Strategy
Bez Strategy wybór algorytmu jest ukryty w łańcuchach if-else. Dodanie nowego algorytmu oznacza edycję klasy kontekstu — naruszenie zasady otwarte-zamknięte (Open/Closed Principle).
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
}Interfejs Strategy
Należy zdefiniować @FunctionalInterface lub zwykły interfejs reprezentujący kontrakt algorytmu. Każda implementacja hermetyzuje inny algorytm.
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); }
}Klasa kontekstu
Kontekst przechowuje odwołanie do strategii i deleguje jej wykonanie algorytmu. Strategię można zmieniać w czasie działania.
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); }
}Zmiana strategii w czasie działania
Strategię można zmienić w locie bez modyfikowania kontekstu. Dzięki temu zachowanie można konfigurować z zewnątrz klasy.
Sorter sorter = new Sorter(new BubbleSortStrategy());
sorter.sort(data); // uses bubble sort
sorter.setStrategy(new QuickSortStrategy());
sorter.sort(data); // now uses quick sortStrategie lambda
Jeśli interfejs strategii jest oznaczony jako @FunctionalInterface, można bezpośrednio używać lambd — w przypadku prostych strategii nie ma potrzeby tworzenia jawnych klas.
Sorter sorter = new Sorter(data -> Collections.sort(data)); // lambda strategy
// or method reference:
Sorter sorter2 = new Sorter(Collections::sort);Strategy w przetwarzaniu płatności
Klasyczny przykład z praktyki: kontekst płatności przyjmuje różne strategie płatności (karta kredytowa, PayPal, kryptowaluty), nie znając szczegółów żadnej z nich.
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 w kompresji
Procesor plików może korzystać z CompressionStrategy. Można podłączyć GZIP, ZIP lub LZ4 bez zmieniania potoku przetwarzania plików.
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]; }
}Łączenie Strategy z Factory
Fabryki należy użyć do wybrania strategii na podstawie konfiguracji, zachowując logikę wyboru oddzieloną zarówno od kontekstu, jak i od samych strategii.
SortStrategy strategy = switch (config.getSortMethod()) {
case "bubble" -> new BubbleSortStrategy();
case "merge" -> new MergeSortStrategy();
default -> Collections::sort;
};
new Sorter(strategy).sort(data);Strategy a Template Method
Template Method wykorzystuje dziedziczenie: szkielet znajduje się w klasie bazowej, a podklasy przesłaniają poszczególne kroki. Strategy wykorzystuje kompozycję: algorytm znajduje się w całości na zewnątrz. Dla większej elastyczności należy preferować Strategy.
Strategia w JDK
Comparator jest wzorcowym przykładem wzorca Strategia w JDK. Przekazując różne komparatory do Collections.sort, można zmienić algorytm porządkowania bez modyfikowania kodu kolekcji.
List<String> names = List.of("Bob", "Alice", "Charlie");
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);Testowanie strategii
Strategie można łatwo testować w izolacji — wystarczy wywołać strategy.sort(data) w teście jednostkowym. Wstrzykiwanie atrap strategii do kontekstu pozwala testować logikę koordynacji kontekstu.
Szybkie sprawdzenie
Jaka jest kluczowa różnica strukturalna między wzorcami Strategia i Metoda szablonowa?
Podsumowanie
Strategia hermetyzuje wymienne algorytmy za wspólnym interfejsem. W przypadku prostych strategii należy używać lambd, a w przypadku złożonych — klas. Wybór strategii zależny od konfiguracji można połączyć z fabrykami.
Często zadawane pytania
Czy lekcja „Wzorzec Strategy: wymienne algorytmy” jest bezpłatna?
Tak — pełny tekst „Wzorzec Strategy: wymienne algorytmy” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorzec Strategy: wymienne algorytmy”?
Hermetyzuj algorytmy sortowania lub płatności za interfejsem Strategy, aby przełączać je w czasie działania programu. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wzorzec Strategy: wymienne algorytmy”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wzorzec Observer: powiadamianie o zdarzeniach
- Wzorzec Strategy: wymienne algorytmy
- Wzorzec Command: hermetyzowanie akcji
- Template Method: definiowanie szkieletów algorytmów