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 diterbitkanPola 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.
Tantangan
MudahMari 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 interfaceITrafficLightStatedi namespaceTrafficdengan methodChange(TrafficLight light). Lalu buat tiga class keadaan konkret:RedState, saatChangedipanggil, tampilkanRed - Stop! Changing to Green...dan ubah keadaan lampu menjadiGreenStateGreenState, tampilkanGreen - Go! Changing to Yellow...dan ubah keadaan menjadiYellowStateYellowState, tampilkanYellow - Caution! Changing to Red...dan ubah keadaan menjadiRedState
TrafficLight.cs: Buat classTrafficLightdi namespace yang sama. Ini adalah class konteks yang mempertahankan keadaan saat ini. Secara default, keadaan awalnya harusRedState, serta memiliki:- Method
SetState(ITrafficLightState state)yang digunakan object keadaan untuk memicu transisi - Method
Change()yang mendelegasikan ke methodChangemilik keadaan saat ini
- Method
Program.cs: Satukan semuanya dengan membuatTrafficLightdan 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
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
File EksternalNamespace & DirektifPengantar class & objectKata Kunci 'this'Method dan ParameterField vs PropertyKonstruktorInisialisasi objectRingkasan: Kalkulator Sederhana4Pewarisan
Sintaks Dasar Pewarisan (:)Kata Kunci 'base'Kata Kunci Virtual & OverrideClass SealedBase Class 'object'Rangkuman: Hierarki Karyawan7Fitur Lanjutan
Overloading OperatorIndexer (this[])Penimpaan ToString()Extension methodRingkasan: Custom list2Property & Anggota Statis
Property yang Diimplementasikan OtomatisProperty Hanya Baca dan Hanya TulisField dan method StatisClass StatisAnggota Berbentuk Ekspresi5Polimorfisme & Antarmuka
Polimorfisme saat kompilasi vs runtimeAntarmuka vs kelas abstrakBeberapa antarmukaAntarmuka eksplisitUpcasting & DowncastingRingkasan, Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi daripada PewarisanGenerics (class dan method)Delegate dan EventAtribut dan ReflectionIDisposable dan Pernyataan usingDasar-Dasar Dependency Injection11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola CompositeLatihan sendiri: Compiler C# online