Pola State
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Java di Coddy. Pelajaran 74 dari 87.
State Pattern adalah pola desain perilaku yang memungkinkan sebuah object mengubah perilakunya saat state internalnya berubah. Object tersebut tampak berganti class, tetapi sebenarnya mendelegasikan perilakunya ke object state yang berbeda. Bayangkan mesin penjual otomatis: responsnya saat tombol ditekan bergantung pada apakah mesin sedang diam, uang sudah dimasukkan, atau produk sedang dikeluarkan.
Alih-alih menggunakan pernyataan percabangan yang kompleks untuk menangani berbagai status, kamu merangkum setiap status dalam class-nya sendiri. Pola ini melibatkan Context yang menyimpan referensi ke status saat ini, dan class State yang menentukan perilaku untuk setiap status:
interface State {
void handle(Context context);
}
class Context {
private State state;
public void setState(State state) {
this.state = state;
}
public void request() {
state.handle(this);
}
}Setiap state konkret menerapkan perilaku dan dapat memicu transisi ke state lain:
class IdleState implements State {
public void handle(Context context) {
System.out.println("Idle: Insert coin to start");
context.setState(new ActiveState());
}
}
class ActiveState implements State {
public void handle(Context context) {
System.out.println("Active: Processing...");
context.setState(new IdleState());
}
}Konteks meneruskan permintaan ke state saat ini, dan perilakunya berubah secara otomatis saat state berubah:
Context context = new Context();
context.setState(new IdleState());
context.request(); // Idle: Masukkan koin untuk memulai
context.request(); // Active: Sedang memproses...Pola State ideal digunakan saat perilaku suatu object sangat bergantung pada statusnya dan harus berubah saat program berjalan. Pola ini menghilangkan blok percabangan yang besar dan memudahkan penambahan status baru, cukup buat class baru yang mengimplementasikan antarmuka State.
Tantangan
MudahMari buat sistem alur kerja dokumen menggunakan State Pattern! Kamu akan membuat sistem yang memodelkan bagaimana dokumen berpindah melalui berbagai tahap, Draft, Review, dan Published. Setiap state menentukan tindakan yang tersedia dan bagaimana perilaku dokumen saat kamu mencoba mengedit atau menyetujuinya.
Kamu akan membagi kodemu ke dalam empat file:
DocumentState.java: Definisikan interfaceDocumentStateyang akan diimplementasikan oleh semua state. Interface ini harus mendeklarasikan dua method:edit(Document doc)untuk mencoba mengedit dokumen, danapprove(Document doc)untuk mencoba menyetujui atau memajukan dokumen ke tahap berikutnya.States.java: Buat tiga class state konkret yang mengimplementasikanDocumentState:DraftState- Saateditdipanggil, cetakEditing draft.... Saatapprovedipanggil, cetakDraft approved. Moving to review.dan pindahkan dokumen keReviewState.ReviewState- Saateditdipanggil, cetakCannot edit during review.(tanpa perubahan state). Saatapprovedipanggil, cetakReview complete. Publishing document.dan pindahkan dokumen kePublishedState.PublishedState- Saateditdipanggil, cetakCannot edit published document.. Saatapprovedipanggil, cetakDocument already published.. Kedua tindakan tidak mengubah state.Document.java: Buat class konteks yang mempertahankan state saat ini.Documentharus memiliki:Field private yang menyimpan
DocumentStatesaat ini, diinisialisasi keDraftStatedi constructor.Method
setState(DocumentState state)yang mengubah state saat ini.Method
edit()yang meneruskan pemanggilan ke methodeditpada state saat ini.Method
approve()yang meneruskan pemanggilan ke methodapprovepada state saat ini.Method
getStatus()yang mengembalikan nama class sederhana dari state saat ini (gunakangetClass().getSimpleName()).Main.java: Tunjukkan sistem state-mu! Kamu akan menerima satu input: urutan tindakan dalam bentuk string yang dipisahkan koma, dengan setiap tindakan berupaeditatauapprove(contohnya:edit,approve,edit,approve).Buat
Documentdan cetak status awalnya dengan formatStatus: [state]. Lalu, proses setiap tindakan secara berurutan dengan memanggil method yang sesuai pada dokumen. Setelah setiap tindakan, cetak status saat ini.
Kamu akan menerima satu input: string tindakan yang dipisahkan koma.
Contohnya, dengan input edit,approve,approve, outputmu adalah:
Status: DraftState
Editing draft...
Status: DraftState
Draft approved. Moving to review.
Status: ReviewState
Review complete. Publishing document.
Status: PublishedStatePerhatikan bagaimana pemanggilan approve() yang sama menghasilkan keluaran berbeda, bergantung pada state dokumen saat ini. Inilah inti dari State Pattern! Dokumen tidak menggunakan percabangan untuk memeriksa state-nya. Sebaliknya, dokumen meneruskan perilaku ke object state saat ini, yang menangani tindakan tersebut dengan tepat dan memicu transisi saat diperlukan.
Coba sendiri
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Buat Document baru
// TODO: Cetak status awal dalam format "Status: [state]"
// TODO: Pisahkan input berdasarkan koma untuk mendapatkan setiap tindakan
// TODO: Lakukan perulangan untuk setiap tindakan
// - Jika tindakan adalah "edit", panggil edit() pada document
// - Jika tindakan adalah "approve", panggil approve() pada document
// - Setelah setiap tindakan, cetak status saat ini
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalPengantar OOPClass dan ObjectKata Kunci thisMethodField (Atribut)Method KonstruktorOverloading KonstruktorRangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan Dasar (extends)Kata Kunci superMethod Overriding (@Override)Rantai KonstruktorKelas ObjectPewarisan Tunggal dan BertingkatMengapa Tidak Ada Pewarisan Multi-KelasRangkuman: Hierarki Karyawan7method Khusus & class Object
method toString()equals() dan hashCode()method clone()compareTo() dan ComparableAntarmuka ComparatorUlasan: Pengurutan Kustom10Penanganan Exception dalam OOP
Hierarki class ExceptionException KustomError Checked vs UncheckedPola Try-with-ResourcesRekap: Pengguna Tervalidasi2Modifier Akses & Enkapsulasi
Ikhtisar Tingkat AksesMethod Getter dan SetterPenyembunyian InformasiKata Kunci finalUlasan: Pengelola Rekening Bank5Polimorfisme
Dasar method overloadingMethod overriding (Saat program berjalan)Upcasting dan downcastingOperator instanceofclass dan method abstrakUlasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanAgregasi vs Komposisiinner, nested, dan anonymous classEnum dan method Enumrecord (Java 16+)sealed class (Java 17+)11Pola Desain Bagian 1
Pengantar Pola DesainPola SingletonPola FactoryPola BuilderPola ObserverPola Strategy3property class dan Anggota Statis
Variabel Instance vs Statismethod StatisBlok StatisKonstanta (static final)Rangkuman: Penghitung dan Utilitas6Antarmuka & Kelas Abstrak
Pengantar AntarmukaMengimplementasikan AntarmukaImplementasi Beberapa AntarmukaDefault & Static pada AntarmukaKelas Abstrak vs AntarmukaAntarmuka FungsionalRekap: Sistem Pembayaran9Generik
Pengantar GenerikClass GenerikMethod GenerikParameter Tipe BerbatasWildcard (?, extends, super)Ulasan: Wadah Generik12Pola Desain Bagian 2
Pola CommandPola AdapterPola DecoratorPola Template MethodPola StatePola CompositePola IteratorLatihan sendiri: Compiler Java online