Menu
CoddyTech

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 berhenti

Output:

Current: Red
Red -> Green
Current: Green
Green -> Yellow
Current: Yellow
Yellow -> Red
Current: Red
Starting music
Already playing
Stopping music
Already stopped

Poin 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.

challenge icon

Tantangan

Mudah

Implementasikan 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.

  • LampState adalah class dasar dengan press(lamp) dan describe().
  • OffState, LowState, dan HighState mengimplementasikannya: press memanggil lamp.set_state(...) dengan keadaan berikutnya (mati ke redup, redup ke terang, terang ke mati), dan describe mengembalikan Lamp is off, Lamp is on low, atau Lamp is on high.
  • Lamp adalah konteksnya: dimulai dalam keadaan OffState, set_state mengganti object keadaan, press_button menyerahkan tugas kepada keadaan saat ini, dan status mengembalikan 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())
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 Python online