Pola State
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 98 dari 110.
Pola State memungkinkan sebuah object mengubah perilakunya saat state internalnya berubah, sehingga tampak seolah-olah object tersebut mengubah class-nya. Alih-alih menggunakan percabangan yang rumit untuk menangani berbagai state, kamu mengenkapsulasi setiap state dalam class tersendiri dan mendelegasikan perilaku kepada object state saat ini.
Pola ini terdiri dari Context yang menyimpan referensi ke state saat ini, dan class State yang menentukan perilaku untuk setiap state yang mungkin. Saat state context berubah, perilakunya berubah secara otomatis:
abstract class DocumentState {
void publish(Document doc);
String getStatus();
}
class DraftState implements DocumentState {
@override
void publish(Document doc) {
print('Moving to review...');
doc.setState(ReviewState());
}
@override
String getStatus() => 'Draft';
}
class ReviewState implements DocumentState {
@override
void publish(Document doc) {
print('Document published!');
doc.setState(PublishedState());
}
@override
String getStatus() => 'Under Review';
}
class PublishedState implements DocumentState {
@override
void publish(Document doc) {
print('Already published.');
}
@override
String getStatus() => 'Published';
}
class Document {
DocumentState _state = DraftState();
void setState(DocumentState state) => _state = state;
void publish() => _state.publish(this);
String getStatus() => _state.getStatus();
}
void main() {
var doc = Document();
print(doc.getStatus()); // Draf
doc.publish(); // Berpindah ke tahap peninjauan...
print(doc.getStatus()); // Dalam Peninjauan
doc.publish(); // Dokumen diterbitkan!
print(doc.getStatus()); // Diterbitkan
}Setiap class status menangani tindakan publish() secara berbeda dan dapat mengalihkan dokumen ke status berikutnya. Class Document tidak memerlukan percabangan untuk memeriksa statusnya saat ini: class tersebut cukup mendelegasikan tugas ke object status yang sedang aktif. Pola ini ideal untuk object dengan mode perilaku yang berbeda, seperti pemrosesan pesanan, pemutar media, atau sistem alur kerja.
Tantangan
MudahMari buat sistem lampu lalu lintas menggunakan pola State! Kamu akan membuat lampu lalu lintas yang berputar melalui berbagai state, dengan setiap state menentukan warna lampu dan cara lampu beralih ke state berikutnya.
Kamu akan mengatur kodemu dalam dua file:
traffic_light.dart: File ini berisi class state dan konteks lampu lalu lintas. Buat class abstrakTrafficLightStatedengan dua method:String getColor()yang mengembalikan warna lampu saat ini, danvoid next(TrafficLight light)yang mengalihkan lampu ke state berikutnya. Buat tiga class state konkret:RedState- mengembalikanREDsebagai warnanya dan mencetakStop! Light is red.saatnext()dipanggil, lalu beralih keGreenStateGreenState- mengembalikanGREENsebagai warnanya dan mencetakGo! Light is green.saatnext()dipanggil, lalu beralih keYellowStateYellowState- mengembalikanYELLOWsebagai warnanya dan mencetakCaution! Light is yellow.saatnext()dipanggil, lalu beralih keRedState
TrafficLight(konteks) yang dimulai dalam stateRedState. Class ini harus memiliki methodsetState()untuk mengubah state saat ini, methodgetColor()yang meneruskan pemanggilan ke state saat ini, dan methodchange()yang memanggilnext()pada state saat ini.main.dart: Impor file lampu lalu lintas, lalu tunjukkan pola State saat digunakan. BuatTrafficLightdan cetak warna awalnya. Kemudian, panggilchange()tiga kali, lalu cetak warnanya setelah setiap perubahan. Ini akan menunjukkan lampu berputar melalui semua state dan kembali ke awal.
Perhatikan bahwa class TrafficLight tidak memerlukan percabangan untuk menentukan perilaku. Setiap state mengetahui warnanya sendiri dan state mana yang menyusul. Lampu lalu lintas cukup meneruskan pemanggilan ke state yang sedang aktif!
Output yang diharapkan:
RED
Stop! Light is red.
GREEN
Go! Light is green.
YELLOW
Caution! Light is yellow.
REDCoba sendiri
import 'traffic_light.dart';
void main() {
// TODO: Buat instance TrafficLight
// TODO: Cetak warna awal
// TODO: Panggil change() dan cetak warna (3 kali untuk melewati semua status)
// Perubahan pertama: RED -> GREEN
// Perubahan kedua: GREEN -> YELLOW
// Perubahan ketiga: YELLOW -> RED
}
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