Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 interface DocumentState yang akan diimplementasikan oleh semua state. Interface ini harus mendeklarasikan dua method: edit(Document doc) untuk mencoba mengedit dokumen, dan approve(Document doc) untuk mencoba menyetujui atau memajukan dokumen ke tahap berikutnya.
  • States.java: Buat tiga class state konkret yang mengimplementasikan DocumentState:

    DraftState - Saat edit dipanggil, cetak Editing draft.... Saat approve dipanggil, cetak Draft approved. Moving to review. dan pindahkan dokumen ke ReviewState.

    ReviewState - Saat edit dipanggil, cetak Cannot edit during review. (tanpa perubahan state). Saat approve dipanggil, cetak Review complete. Publishing document. dan pindahkan dokumen ke PublishedState.

    PublishedState - Saat edit dipanggil, cetak Cannot edit published document.. Saat approve dipanggil, cetak Document already published.. Kedua tindakan tidak mengubah state.

  • Document.java: Buat class konteks yang mempertahankan state saat ini. Document harus memiliki:

    Field private yang menyimpan DocumentState saat ini, diinisialisasi ke DraftState di constructor.

    Method setState(DocumentState state) yang mengubah state saat ini.

    Method edit() yang meneruskan pemanggilan ke method edit pada state saat ini.

    Method approve() yang meneruskan pemanggilan ke method approve pada state saat ini.

    Method getStatus() yang mengembalikan nama class sederhana dari state saat ini (gunakan getClass().getSimpleName()).

  • Main.java: Tunjukkan sistem state-mu! Kamu akan menerima satu input: urutan tindakan dalam bentuk string yang dipisahkan koma, dengan setiap tindakan berupa edit atau approve (contohnya: edit,approve,edit,approve).

    Buat Document dan cetak status awalnya dengan format Status: [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: PublishedState

Perhatikan 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
    }
}
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 Java online