0Pricing
Java Academy · Lekcja

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 sort

Strategie 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

  1. Wzorzec Observer: powiadamianie o zdarzeniach
  2. Wzorzec Strategy: wymienne algorytmy
  3. Wzorzec Command: hermetyzowanie akcji
  4. Template Method: definiowanie szkieletów algorytmów
← Powrót do Java Academy