🐆

State

2023/09/10に公開

State パターンは、オブジェクトの内部状態が変わるたびにオブジェクトの動作を変更するためのデザインパターンです。このパターンは、オブジェクトが状態ごとに異なる動作を持つ場合や、複雑な条件や分岐がオブジェクトの動作に関連する場合に役立ちます。

主要な構成要素:

  1. Context (文脈): 現在の状態を定義し、クライアントに対して一貫したインターフェースを提供するクラス。
  2. State (状態): すべての具体的な状態が実装すべきインターフェース。
  3. ConcreteState (具体的な状態): State インターフェースを実装し、Contextの状態に関連する特定の動作を提供するクラス。

例:

単純なトラフィックライトを考えてみましょう。

  1. State:

    from abc import ABC, abstractmethod
    
    class TrafficLightState(ABC):
        @abstractmethod
        def change(self, light):
            pass
    
    
  2. ConcreteState:

    class RedLight(TrafficLightState):
        def change(self, light):
            print("Red Light -> Changing to Green")
            light.state = GreenLight()
    
    class GreenLight(TrafficLightState):
        def change(self, light):
            print("Green Light -> Changing to Yellow")
            light.state = YellowLight()
    
    class YellowLight(TrafficLightState):
        def change(self, light):
            print("Yellow Light -> Changing to Red")
            light.state = RedLight()
    
    
  3. Context:

    class TrafficLight:
        def __init__(self):
            self.state = RedLight()
    
        def change_state(self):
            self.state.change(self)
    
    

使用方法:

    light = TrafficLight()
    light.change_state()
    light.change_state()
    light.change_state()

出力:

Red Light -> Changing to Green
Green Light -> Changing to Yellow
Yellow Light -> Changing to Red

利点:

  1. ロジックの整理: State パターンは、複雑な分岐や状態遷移のロジックをクリーンに整理するのに役立ちます。
  2. 拡張性: 新しい状態や遷移が必要になった場合、新しい ConcreteState クラスを追加するだけで簡単に拡張できます。
  3. 疎結合: State パターンを使用すると、状態ごとのロジックが独立したクラスになるため、各状態のコードは他の状態から疎結合となります。

State パターンは、状態遷移のロジックが複雑な場合や、将来的に新しい状態や遷移を追加する可能性がある場合に特に有用です。

Discussion