Menu
CoddyTech

Pola State

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan C# di Coddy. Pelajaran 60 dari 70.

Pola State adalah pola perilaku yang memungkinkan sebuah object mengubah perilakunya saat state internalnya berubah. Alih-alih menggunakan pernyataan 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 tiga komponen: antarmuka state yang mendefinisikan perilaku khusus untuk setiap state, class state konkret yang mengimplementasikan perilaku tersebut, dan class konteks yang menyimpan referensi ke state saat ini:

public interface IDocumentState
{
    void Publish(Document doc);
}

public class DraftState : IDocumentState
{
    public void Publish(Document doc)
    {
        Console.WriteLine("Moving to moderation");
        doc.SetState(new ModerationState());
    }
}

public class ModerationState : IDocumentState
{
    public void Publish(Document doc)
    {
        Console.WriteLine("Publishing document");
        doc.SetState(new PublishedState());
    }
}

public class PublishedState : IDocumentState
{
    public void Publish(Document doc)
    {
        Console.WriteLine("Already published");
    }
}

Konteks menyimpan state saat ini dan mendelegasikan tindakan kepadanya. Object state dapat memicu transisi dengan memanggil SetState() pada konteks:

public class Document
{
    private IDocumentState _state = new DraftState();
    
    public void SetState(IDocumentState state) => _state = state;
    
    public void Publish() => _state.Publish(this);
}

var doc = new Document();
doc.Publish();  // Beralih ke moderasi
doc.Publish();  // Menerbitkan dokumen
doc.Publish();  // Sudah diterbitkan

Pola State menghilangkan pernyataan if-else atau switch yang panjang untuk memeriksa keadaan saat ini. Setiap class keadaan hanya menangani perilakunya sendiri, sehingga kodemu lebih mudah dipelihara dan diperluas dengan keadaan baru.

challenge icon

Tantangan

Mudah

Mari kita buat sistem lampu lalu lintas menggunakan pola State. Lampu lalu lintas berganti melalui beberapa keadaan yang berbeda (merah, kuning, hijau), dan setiap keadaan menentukan apa yang terjadi saat lampu berubah. Daripada menggunakan percabangan yang rumit, kamu akan mengenkapsulasi setiap keadaan lampu dalam class tersendiri.

Kamu akan mengatur kodemu dalam tiga file:

  • TrafficLightState.cs: Definisikan interface ITrafficLightState di namespace Traffic dengan method Change(TrafficLight light). Lalu buat tiga class keadaan konkret:
    • RedState, saat Change dipanggil, tampilkan Red - Stop! Changing to Green... dan ubah keadaan lampu menjadi GreenState
    • GreenState, tampilkan Green - Go! Changing to Yellow... dan ubah keadaan menjadi YellowState
    • YellowState, tampilkan Yellow - Caution! Changing to Red... dan ubah keadaan menjadi RedState
  • TrafficLight.cs: Buat class TrafficLight di namespace yang sama. Ini adalah class konteks yang mempertahankan keadaan saat ini. Secara default, keadaan awalnya harus RedState, serta memiliki:
    • Method SetState(ITrafficLightState state) yang digunakan object keadaan untuk memicu transisi
    • Method Change() yang mendelegasikan ke method Change milik keadaan saat ini
  • Program.cs: Satukan semuanya dengan membuat TrafficLight dan melakukan pergantian keadaan berdasarkan input.

Kamu akan menerima satu input:

  • Jumlah kali lampu lalu lintas harus berubah (bilangan bulat)

Buat TrafficLight (yang dimulai dengan keadaan merah) dan panggil Change() sebanyak jumlah yang ditentukan.

Misalnya, jika inputnya 3, outputnya adalah:

Red - Stop! Changing to Green...
Green - Go! Changing to Yellow...
Yellow - Caution! Changing to Red...

Jika inputnya 5, siklus lampu akan kembali ke awal:

Red - Stop! Changing to Green...
Green - Go! Changing to Yellow...
Yellow - Caution! Changing to Red...
Red - Stop! Changing to Green...
Green - Go! Changing to Yellow...

Perhatikan bahwa class TrafficLight tidak berisi logika tentang arti setiap warna atau warna yang muncul berikutnya. Semua pengetahuan itu terdapat dalam masing-masing class keadaan. Setiap keadaan bertanggung jawab atas perilakunya sendiri dan memicu transisi ke keadaan berikutnya!

Coba sendiri

using System;
using Traffic;

class Program
{
    public static void Main(String[] args)
    {
        // Baca jumlah kali lampu lalu lintas harus berganti
        int n = Convert.ToInt32(Console.ReadLine());

        // TODO: Buat instance TrafficLight (dimulai dari RedState secara default)

        // TODO: Panggil method Change() sebanyak n kali menggunakan perulangan
    }
}
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 C# online