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.
Tantangan
MudahMari 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 abstrakCommandyang mendeklarasikan methodexecute(). Lalu buat classTextDocument(penerima) yang memiliki fieldString content(awalnya kosong) dan tiga method:append(String text)- menambahkan teks di akhir contentclear()- mengatur content menjadi string kosongshow()- mencetakDocument: [content]
TextDocument:AppendCommand- menerima dokumen dan teks di constructornya, lalu menambahkan teks saat dijalankanClearCommand- menerima dokumen di constructornya, lalu mengosongkannya saat dijalankanShowCommand- menerima dokumen di constructornya, lalu menampilkan content-nya saat dijalankan
TextEditor(pemanggil) yang menyimpan list perintah. Class ini harus memiliki methodaddCommand(Command command)untuk mengantrekan perintah, dan methodrunAll()yang menjalankan semua perintah yang diantrekan secara berurutan.main.dart: Impor file perintahmu dan tunjukkan pola Command. BuatTextDocumentdanTextEditor. Antrekan perintah berikut secara berurutan: tambahkanHello, tambahkanWorld, 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
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses Pembayaran12OOP Asinkron
Futures & async/awaitDasar-Dasar StreamPengontrol StreamKonstruktor AsinkronAsync dalam Method ClassRangkuman: Pengambil Data15Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola RepositoryLatihan sendiri: Compiler Dart online