Menu
Coddy logo textTech

Wzorzec Strategy

Część sekcji Programowanie obiektowe ścieżki Dart w Coddy. Lekcja 93 z 110.

Wzorzec Strategy pozwala zdefiniować rodzinę algorytmów, zamknąć każdy z nich we własnej klasie i sprawić, by można je było wymieniać w czasie działania programu. Zamiast kodować zachowanie na stałe w klasie, wstrzykujesz je za pośrednictwem interfejsu, co pozwala wymieniać strategie bez modyfikowania klasy, która z nich korzysta.

Rozważ system płatności, w którym chcesz obsługiwać różne metody płatności. Zamiast używać instrukcji warunkowych do obsługi każdej metody, definiujesz interfejs strategii i tworzysz konkretne implementacje:

abstract class PaymentStrategy {
  void pay(double amount);
}

class CreditCardPayment implements PaymentStrategy {
  @override
  void pay(double amount) => print('Paid \$$amount with Credit Card');
}

class PayPalPayment implements PaymentStrategy {
  @override
  void pay(double amount) => print('Paid \$$amount with PayPal');
}

class ShoppingCart {
  PaymentStrategy _paymentStrategy;

  ShoppingCart(this._paymentStrategy);

  void setPaymentStrategy(PaymentStrategy strategy) {
    _paymentStrategy = strategy;
  }

  void checkout(double total) {
    _paymentStrategy.pay(total);
  }
}

void main() {
  var cart = ShoppingCart(CreditCardPayment());
  cart.checkout(99.99);  // Zapłacono $99.99 kartą kredytową

  cart.setPaymentStrategy(PayPalPayment());
  cart.checkout(49.99);  // Zapłacono $49.99 przez PayPal
}

Obiekt ShoppingCart nie wie, jak działa płatność, i nie obchodzi go to — po prostu deleguje jej obsługę do aktualnie ustawionej strategii. Możesz dodawać nowe metody płatności, tworząc nowe klasy strategii, bez modyfikowania kodu koszyka. Ten wzorzec sprawdza się idealnie, gdy masz kilka sposobów wykonania działania i chcesz dynamicznie wybierać między nimi lub przełączać się między nimi.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system formatowania tekstu z użyciem wzorca Strategia! Stworzysz system, w którym do tekstu można stosować różne strategie formatowania, umożliwiając użytkownikom dynamiczne przełączanie formatów bez zmieniania głównego procesora tekstu.

Podzielisz kod na dwa pliki:

  • formatting_strategies.dart: Tutaj utwórz system strategii. Zdefiniuj klasę abstrakcyjną FormattingStrategy z metodą String format(String text). Następnie zaimplementuj trzy konkretne strategie:
    • UppercaseStrategy - zamienia cały tekst na wielkie litery
    • LowercaseStrategy - zamienia cały tekst na małe litery
    • TitleCaseStrategy - zamienia pierwszą literę każdego słowa na wielką (podziel tekst według spacji, zamień pierwszy znak każdego słowa na wielką literę, a pozostałe na małe)
    Utwórz także klasę TextProcessor, która przechowuje FormattingStrategy. Powinna mieć konstruktor przyjmujący początkową strategię, metodę setStrategy() do zmiany strategii w czasie działania programu oraz metodę process(String text), która stosuje bieżącą strategię i zwraca sformatowany wynik.
  • main.dart: Zaimportuj strategie formatowania i pokaż, jak wzorzec Strategia umożliwia dynamiczne przełączanie zachowania. Utwórz TextProcessor, zaczynając od UppercaseStrategy. Przetwórz tekst hello world i wyświetl wynik. Następnie przełącz na LowercaseStrategy, przetwórz HELLO WORLD i wyświetl wynik. Na koniec przełącz na TitleCaseStrategy, przetwórz the quick brown fox i wyświetl wynik.

To pokazuje siłę wzorca Strategia — TextProcessor nie musi znać szczegółów działania formatowania. Po prostu przekazuje zadanie aktualnie ustawionej strategii, dzięki czemu można łatwo dodawać nowe opcje formatowania bez modyfikowania procesora!

Oczekiwany wynik:

HELLO WORLD
hello world
The Quick Brown Fox

Spróbuj swoich sił

import 'formatting_strategies.dart';

void main() {
  // TODO: Utwórz TextProcessor, zaczynając od UppercaseStrategy
  
  // TODO: Przetwórz tekst 'hello world' i wypisz wynik
  
  // TODO: Przełącz na LowercaseStrategy
  
  // TODO: Przetwórz 'HELLO WORLD' i wypisz wynik
  
  // TODO: Przełącz na TitleCaseStrategy
  
  // TODO: Przetwórz 'the quick brown fox' i wypisz wynik
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Dart online