Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 abstrak TrafficLightState dengan dua method: String getColor() yang mengembalikan warna lampu saat ini, dan void next(TrafficLight light) yang mengalihkan lampu ke state berikutnya. Buat tiga class state konkret:
    • RedState - mengembalikan RED sebagai warnanya dan mencetak Stop! Light is red. saat next() dipanggil, lalu beralih ke GreenState
    • GreenState - mengembalikan GREEN sebagai warnanya dan mencetak Go! Light is green. saat next() dipanggil, lalu beralih ke YellowState
    • YellowState - mengembalikan YELLOW sebagai warnanya dan mencetak Caution! Light is yellow. saat next() dipanggil, lalu beralih ke RedState
    Kemudian, buat class TrafficLight (konteks) yang dimulai dalam state RedState. Class ini harus memiliki method setState() untuk mengubah state saat ini, method getColor() yang meneruskan pemanggilan ke state saat ini, dan method change() yang memanggil next() pada state saat ini.
  • main.dart: Impor file lampu lalu lintas, lalu tunjukkan pola State saat digunakan. Buat TrafficLight dan cetak warna awalnya. Kemudian, panggil change() 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.
RED

Coba 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
}
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