Pola State
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 53 dari 64.
Pola State memungkinkan sebuah object mengubah perilakunya saat state internalnya berubah. Object tersebut tampak mengubah class-nya berdasarkan state saat ini.
Berikut class state sederhana untuk lampu lalu lintas:
class RedState:
def next_state(self, light):
print("Red -> Green")
light.state = GreenState()
def current_color(self):
return "Red"
class GreenState:
def next_state(self, light):
print("Green -> Yellow")
light.state = YellowState()
def current_color(self):
return "Green"
class YellowState:
def next_state(self, light):
print("Yellow -> Red")
light.state = RedState()
def current_color(self):
return "Yellow"Setiap state menentukan apa yang terjadi saat bertransisi ke state berikutnya.
Buat class konteks yang menyimpan status saat ini:
class TrafficLight:
def __init__(self):
self.state = RedState() # Mulai dengan warna merah
def change(self):
self.state.next_state(self)
def get_color(self):
return self.state.current_color()Lampu lalu lintas mendelegasikan perilakunya ke object state saat ini.
Gunakan lampu lalu lintas:
light = TrafficLight()
print(f"Current: {light.get_color()}")
light.change() # Merah -> Hijau
print(f"Current: {light.get_color()}")
light.change() # Hijau -> Kuning
print(f"Current: {light.get_color()}")
light.change() # Kuning -> Merah
print(f"Current: {light.get_color()}")Buat contoh lain dengan pemutar sederhana:
class PlayingState:
def play(self, player):
print("Already playing")
def stop(self, player):
print("Stopping music")
player.state = StoppedState()
class StoppedState:
def play(self, player):
print("Starting music")
player.state = PlayingState()
def stop(self, player):
print("Already stopped")
class MusicPlayer:
def __init__(self):
self.state = StoppedState()
def play(self):
self.state.play(self)
def stop(self):
self.state.stop(self)
player = MusicPlayer()
player.play() # Memulai musik
player.play() # Musik sudah diputar
player.stop() # Menghentikan musik
player.stop() # Musik sudah berhentiOutput:
Current: Red
Red -> Green
Current: Green
Green -> Yellow
Current: Yellow
Yellow -> Red
Current: Red
Starting music
Already playing
Stopping music
Already stoppedPoin Penting: State Pattern mengenkapsulasi perilaku khusus untuk setiap state dalam class terpisah dan memungkinkan object konteks mendelegasikan tugas ke state saat ini. Saat state berubah, perilakunya berubah secara otomatis. Pola ini menghilangkan pernyataan if/else yang kompleks dan memudahkan penambahan state baru.
Tantangan
MudahImplementasikan pola State di state.py untuk lampu dengan satu tombol. Setiap kali tombol ditekan, lampu berpindah melalui tiga keadaan dalam sebuah siklus: mati, redup, terang, lalu kembali ke keadaan mati. Alih-alih menggunakan rangkaian if pada string, setiap keadaan merupakan object tersendiri yang mengetahui apa yang terjadi saat tombol ditekan.
LampStateadalah class dasar denganpress(lamp)dandescribe().OffState,LowState, danHighStatemengimplementasikannya:pressmemanggillamp.set_state(...)dengan keadaan berikutnya (mati ke redup, redup ke terang, terang ke mati), dandescribemengembalikanLamp is off,Lamp is on low, atauLamp is on high.Lampadalah konteksnya: dimulai dalam keadaanOffState,set_statemengganti object keadaan,press_buttonmenyerahkan tugas kepada keadaan saat ini, danstatusmengembalikan deskripsi saat ini.
driver.py dikunci: file ini menekan tombol dan mencetak status. Perhatikan bahwa Lamp tidak pernah memeriksa keadaannya. Object keadaan yang menentukan.
Coba sendiri
from state import Lamp
# Penangan kasus uji (jangan diubah)
test_case = input()
lamp = Lamp()
if test_case == "initial_test":
print(lamp.status())
elif test_case == "one_press_test":
lamp.press_button()
print(lamp.status())
elif test_case == "cycle_test":
for _ in range(4):
print(lamp.status())
lamp.press_button()
elif test_case == "many_presses_test":
for _ in range(7):
lamp.press_button()
print(lamp.status())
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 vs objectParameter selfmethodAtributMethod Konstruktor (__init__)Rangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan DasarFungsi super()Penimpaan MethodPewarisan BergandaUrutan Resolusi MethodRingkasan: Hierarki Karyawan5Polimorfisme
Meninjau Ulang Method OverridingDuck Typingclass dan method AbstrakDesain InterfaceRingkasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanMixinsMetode Statis dan Metode ClassDecorator ClassPengelola Konteks11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Property class
Variabel instance vs variabel classDekorator propertyAtribut privatRangkuman: Pengelola Rekening Bank6Enkapsulasi
Anggota Public, Protected, PrivateModifier AksesPenyembunyian InformasiDecorator Property Tingkat LanjutUlasan: Sistem Catatan Siswa12Proyek: Manajemen Perpustakaan
Ikhtisar Proyekclass Buku dan PenggunaSistem PeminjamanFitur PencarianAntarmuka AdminPengujian dan IntegrasiLatihan sendiri: Compiler Python online