概要
State(ステート)パターンは、
オブジェクトの内部状態によって振る舞い(メソッドの実装)を変更したいときに、状態をオブジェクトとして抽象化し、切り替える設計パターンである。
条件分岐を減らし、状態ごとの処理を明示的に定義することで、コードの見通しと保守性が劇的に向上する。
1. なぜStateが必要か?
❌ 条件分岐による状態管理はスパゲッティ化しやすい
def handle(user):
if user.state == "guest":
...
elif user.state == "member":
...
elif user.state == "admin":
...
→ 分岐が増えるたびに関係性が複雑になり、修正コストが高くなる
✅ 状態をクラス化して動的に切り替える
user.set_state(MemberState())
user.handle()
→ 状態ごとの振る舞いを独立したオブジェクトとして管理できる
2. 基本構造
✅ Stateインターフェース(振る舞い定義)
class State:
def handle(self, context):
raise NotImplementedError
✅ ConcreteState(具体的な状態)
class GuestState(State):
def handle(self, context):
print("ゲストとして閲覧のみ可能")
class MemberState(State):
def handle(self, context):
print("メンバーとしてコンテンツ閲覧・投稿可能")
class AdminState(State):
def handle(self, context):
print("管理者としてすべての操作が可能")
✅ Context(状態の保持と委譲)
class User:
def __init__(self, state: State):
self._state = state
def set_state(self, state: State):
self._state = state
def handle(self):
self._state.handle(self)
✅ 使用例
user = User(GuestState())
user.handle()
user.set_state(MemberState())
user.handle()
user.set_state(AdminState())
user.handle()
出力:
ゲストとして閲覧のみ可能
メンバーとしてコンテンツ閲覧・投稿可能
管理者としてすべての操作が可能
3. Python的応用:状態切り替えを辞書で管理するシンプル実装
class User:
def __init__(self):
self._state = "guest"
self.handlers = {
"guest": lambda: print("閲覧のみ"),
"member": lambda: print("投稿可能"),
"admin": lambda: print("管理操作可能")
}
def set_state(self, state):
self._state = state
def handle(self):
self.handlers[self._state]()
→ 少数の状態なら辞書でスリムに管理できる
4. 実務ユースケース
✅ ユーザーの権限管理(ゲスト・会員・管理者)
→ 権限に応じた操作制限・UI制御
✅ ワークフローの状態管理(未処理・処理中・完了・保留)
→ 各状態に応じた操作ルールや次遷移の制御
✅ ネットワーク接続の状態遷移(Disconnected → Connecting → Connected)
→ 状態に応じて異なるハンドリングを適用
✅ UIコンポーネントの表示状態(表示中・非表示・無効・ローディング)
→ 見た目や挙動を状態で柔軟に制御可能
5. よくある誤用と対策
❌ 状態の数が少ないのにクラス化して逆に冗長に
→ ✅ 2〜3状態なら辞書や関数でも十分
❌ 状態クラスがcontextの内部構造に依存しすぎる
→ ✅ 依存関係は明示的に注入 or 最小限の抽象に留める
❌ 状態遷移の管理がコンテキスト外でバラバラに
→ ✅ 遷移ルールは明示的にドキュメント or 遷移マップで制御
結語
Stateパターンとは、“変化する状態をオブジェクトとして封じ込め、統一されたインターフェースで振る舞いを切り替える設計”である。
- 条件分岐をオブジェクトに変換し、状態ごとの責任を明確化
- 状態の追加・変更がしやすく、拡張性と保守性が高い構造
- Pythonではクラス/関数/辞書の柔軟な使い分けにより、状況に応じた最適な実装が可能
Pythonicとは、“状態を意識せず、振る舞いとして自然に表現すること”。
Stateパターンはその変化への対応力を、設計の動的柔軟性として定義する技法である。