Menu
CoddyTech

Pola Command

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 94 dari 110.

Pola Command membungkus permintaan sebagai object, sehingga kamu bisa memberi parameter kepada client dengan berbagai permintaan, mengantrekan operasi, atau mendukung fungsi undo. Alih-alih memanggil method secara langsung, kamu membungkus tindakan dalam object perintah yang bisa disimpan, diteruskan, atau dijalankan nanti.

Pola ini terdiri dari tiga komponen utama: antarmuka Command dengan method execute, Command Konkret yang menerapkan tindakan tertentu, dan Receiver yang melakukan pekerjaan sebenarnya. Invoker opsional memicu perintah tanpa mengetahui apa yang dilakukannya:

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();  // Lampu menyala

  remote.setCommand(TurnOffCommand(light));
  remote.pressButton();  // Lampu mati
}

RemoteControl tidak mengetahui apa pun tentang lampu, alat ini hanya menjalankan perintah apa pun yang diberikan kepadanya. Pemisahan ini memudahkan penambahan perintah baru tanpa mengubah pemanggil. Pola Command ideal untuk menerapkan sistem undo/redo, antrean tugas, atau perekaman makro saat kamu perlu memperlakukan tindakan sebagai object kelas satu.

challenge icon

Tantangan

Mudah

Mari buat sistem perintah editor teks menggunakan pola Command! Kamu akan membuat sistem yang mengemas operasi teks sebagai object perintah, sehingga editor dapat menjalankan berbagai tindakan tanpa mengetahui detail setiap operasi. Ini adalah kasus penggunaan klasik untuk pola Command. Bayangkan sistem undo/redo, tempat setiap tindakan disimpan sebagai object.

Kamu akan mengatur kodemu ke dalam dua file:

  • commands.dart: Buat sistem perintahmu di sini. Mulailah dengan class abstrak Command yang mendeklarasikan method execute(). Lalu buat class TextDocument (penerima) yang memiliki field String content (awalnya kosong) dan tiga method:
    • append(String text) - menambahkan teks di akhir content
    • clear() - mengatur content menjadi string kosong
    • show() - mencetak Document: [content]
    Sekarang, implementasikan tiga perintah konkret yang bekerja dengan TextDocument:
    • AppendCommand - menerima dokumen dan teks di constructornya, lalu menambahkan teks saat dijalankan
    • ClearCommand - menerima dokumen di constructornya, lalu mengosongkannya saat dijalankan
    • ShowCommand - menerima dokumen di constructornya, lalu menampilkan content-nya saat dijalankan
    Terakhir, buat class TextEditor (pemanggil) yang menyimpan list perintah. Class ini harus memiliki method addCommand(Command command) untuk mengantrekan perintah, dan method runAll() yang menjalankan semua perintah yang diantrekan secara berurutan.
  • main.dart: Impor file perintahmu dan tunjukkan pola Command. Buat TextDocument dan TextEditor. Antrekan perintah berikut secara berurutan: tambahkan Hello, tambahkan World, tampilkan dokumen, tambahkan !, tampilkan lagi, kosongkan dokumen, lalu tampilkan sekali lagi. Kemudian jalankan semua perintah yang diantrekan.

Perhatikan bahwa TextEditor tidak mengetahui apa pun tentang menambahkan, mengosongkan, atau menampilkan. Class ini hanya menjalankan perintah apa pun yang diberikan kepadanya. Pemisahan inilah inti dari pola Command!

Output yang diharapkan:

Document: Hello World
Document: Hello World!
Document: 

Coba sendiri

import 'commands.dart';

void main() {
  // TODO: Buat instance TextDocument

  // TODO: Buat instance TextEditor

  // TODO: Masukkan perintah berikut ke antrean secara berurutan:
  // 1. Tambahkan "Hello"
  // 2. Tambahkan " World"
  // 3. Tampilkan dokumen
  // 4. Tambahkan "!"
  // 5. Tampilkan dokumen lagi
  // 6. Kosongkan dokumen
  // 7. Tampilkan dokumen untuk terakhir kalinya

  // TODO: Jalankan semua perintah dalam antrean
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online