Durum Kalıbı
Coddy'nin Python Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 53 / 64.
State Pattern, bir nesnenin dahili durumu değiştiğinde davranışını değiştirmesine olanak tanır. Nesne, mevcut durumuna göre sınıfını değiştiriyormuş gibi görünür.
İşte bir trafik ışığı için basit durum sınıfları:
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"Her durum, bir sonraki duruma geçiş yapılırken ne olacağını tanımlar.
Mevcut durumu tutan bir bağlam sınıfı oluşturun:
class TrafficLight:
def __init__(self):
self.state = RedState() # Kırmızı ile başla
def change(self):
self.state.next_state(self)
def get_color(self):
return self.state.current_color()Trafik lambası davranışı mevcut durum nesnesine devreder.
Trafik ışığını kullanın:
light = TrafficLight()
print(f"Current: {light.get_color()}")
light.change() # Kırmızı -> Yeşil
print(f"Current: {light.get_color()}")
light.change() # Yeşil -> Sarı
print(f"Current: {light.get_color()}")
light.change() # Sarı -> Kırmızı
print(f"Current: {light.get_color()}")Basit bir oynatıcıyla başka bir örnek oluşturalım:
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() # Müzik başlatılıyor
player.play() # Zaten çalıyor
player.stop() # Müzik durduruluyor
player.stop() # Zaten durmuşÇıktı:
Current: Red
Red -> Green
Current: Green
Green -> Yellow
Current: Yellow
Yellow -> Red
Current: Red
Starting music
Already playing
Stopping music
Already stoppedTemel Nokta: State Pattern, duruma özgü davranışı ayrı sınıflarda kapsüller ve context nesnesinin işlemleri mevcut duruma devretmesini sağlar. Durum değiştiğinde davranış da otomatik olarak değişir. Bu, karmaşık if/else ifadelerini ortadan kaldırır ve yeni durumlar eklemeyi kolaylaştırır.
Görev
KolayTek düğmeli bir lamba için state.py dosyasında State desenini uygulayın. Her basış, lambayı bir döngü içinde üç durumdan geçirir: kapalı, düşük, yüksek ve tekrar kapalı. Bir dize üzerinde if zinciri kullanmak yerine her durum, düğmeye basıldığında ne olacağını bilen kendi nesnesidir.
LampState,press(lamp)vedescribe()metotlarına sahip temel sınıftır.OffState,LowStateveHighStatebu metotları uygular:press, sonraki durumla (kapalıdan düşüğe, düşükten yükseğe, yüksekten kapalıya) birliktelamp.set_state(...)çağrısını yapar vedescribe,Lamp is off,Lamp is on lowveyaLamp is on highdöndürür.Lampbağlamdır:OffStatedurumunda başlar,set_statedurum nesnesini değiştirir,press_buttonçağrıyı mevcut duruma devreder vestatusmevcut açıklamayı döndürür.
driver.py kilitlidir: düğmeye basar ve durumu yazdırır. Lamp'ın hangi durumda olduğunu hiçbir zaman kontrol etmediğine dikkat edin; buna durum nesneleri karar verir.
Kendin dene
from state import Lamp
# Test durumu işleyicisi (değiştirmeyin)
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())
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıKendi başına pratik yap: Online Python derleyicisi