Menu
Coddy logo textTech

Wzorzec polecenia

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

Wzorzec Command hermetyzuje żądanie w obiekcie, umożliwiając parametryzowanie klientów różnymi żądaniami, kolejkowanie operacji lub obsługę funkcji cofania. Zamiast bezpośrednio wywoływać metodę, opakowujesz działanie w obiekt polecenia, który można przechowywać, przekazywać dalej lub wykonać później.

Wzorzec ten obejmuje trzy kluczowe elementy: interfejs Command z metodą wykonującą, konkretne polecenia, które implementują określone działania, oraz odbiorcę, który wykonuje właściwą pracę. Opcjonalny wywołujący uruchamia polecenia, nie wiedząc, co robią:

abstract class Command {
  void execute();
}

class Light {
  void turnOn() => print('Light is ON');
  void turnOff() => print('Light is OFF');
}

class TurnOnCommand implements Command {
  final Light light;
  TurnOnCommand(this.light);

  @override
  void execute() => light.turnOn();
}

class TurnOffCommand implements Command {
  final Light light;
  TurnOffCommand(this.light);

  @override
  void execute() => light.turnOff();
}

class RemoteControl {
  Command? _command;

  void setCommand(Command command) {
    _command = command;
  }

  void pressButton() {
    _command?.execute();
  }
}

void main() {
  var light = Light();
  var remote = RemoteControl();

  remote.setCommand(TurnOnCommand(light));
  remote.pressButton();  // Light is ON

  remote.setCommand(TurnOffCommand(light));
  remote.pressButton();  // Light is OFF
}

RemoteControl nic nie wie o światłach — po prostu wykonuje otrzymane polecenie. To rozdzielenie ułatwia dodawanie nowych poleceń bez modyfikowania wywołującego. Wzorzec Command idealnie nadaje się do implementowania systemów cofania i ponawiania, kolejek zadań lub nagrywania makr, gdy trzeba traktować działania jako pełnoprawne obiekty.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system poleceń dla edytora tekstu, używając wzorca Command! Utworzysz system, który hermetyzuje operacje na tekście jako obiekty poleceń, dzięki czemu edytor może wykonywać różne działania bez znajomości szczegółów każdej operacji. To klasyczne zastosowanie wzorca Command — pomyśl o nim jak o systemie cofania i ponawiania, w którym każde działanie jest przechowywane jako obiekt.

Podzielisz kod na dwa pliki:

  • commands.dart: Utwórz tutaj system poleceń. Zacznij od klasy abstrakcyjnej Command, która deklaruje metodę execute(). Następnie utwórz klasę TextDocument (odbiorcę), która przechowuje pole String content (początkowo puste) i ma trzy metody:
    • append(String text) — dodaje tekst na końcu zawartości
    • clear() — ustawia zawartość na pusty ciąg znaków
    • show() — wyświetla Document: [content]
    Teraz zaimplementuj trzy konkretne polecenia, które współpracują z klasą TextDocument:
    • AppendCommand — w konstruktorze przyjmuje dokument i tekst, a po wykonaniu dołącza tekst
    • ClearCommand — w konstruktorze przyjmuje dokument, a po wykonaniu go czyści
    • ShowCommand — w konstruktorze przyjmuje dokument, a po wykonaniu wyświetla jego zawartość
    Na koniec utwórz klasę TextEditor (inicjatora), która przechowuje listę poleceń. Powinna mieć metodę addCommand(Command command) służącą do dodawania poleceń do kolejki oraz metodę runAll(), która wykonuje wszystkie polecenia z kolejki w odpowiedniej kolejności.
  • main.dart: Zaimportuj plik z poleceniami i zademonstruj wzorzec Command. Utwórz obiekt TextDocument i obiekt TextEditor. Dodaj do kolejki następujące polecenia w podanej kolejności: dołącz Hello, dołącz World, wyświetl dokument, dołącz !, wyświetl ponownie, wyczyść dokument i wyświetl go po raz ostatni. Następnie wykonaj wszystkie polecenia z kolejki.

Zwróć uwagę, że TextEditor nie wie nic o dołączaniu, czyszczeniu ani wyświetlaniu — po prostu wykonuje przekazane mu polecenia. To właśnie istota wzorca Command!

Oczekiwany wynik:

Document: Hello World
Document: Hello World!
Document: 

Spróbuj swoich sił

import 'commands.dart';

void main() {
  // TODO: Utwórz instancję TextDocument

  // TODO: Utwórz instancję TextEditor

  // TODO: Dodaj poniższe polecenia do kolejki w podanej kolejności:
  // 1. Dopisz "Hello"
  // 2. Dopisz " World"
  // 3. Wyświetl dokument
  // 4. Dopisz "!"
  // 5. Wyświetl dokument ponownie
  // 6. Wyczyść dokument
  // 7. Wyświetl dokument po raz ostatni

  // TODO: Wykonaj wszystkie polecenia z kolejki
}
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