Stateパターン
オブジェクトの内部状態に応じて振る舞いを変更するデザインパターンです。IfやSelect Caseによる複雑な条件分岐をクラスの切り替えで表現できるため、コードの可視性や保守性が向上します。
構成要素
State(状態)
ConcreteState(具象状態)
Context(文脈)
状態ごとの振る舞いを定義するインターフェース
ConcreteState(具象状態)
各状態における実際の処理を記述するクラス
Context(文脈)
現在の状態を表すオブジェクトを保持し、操作を実行するクラス
メリット
条件分岐の排除
責務の分離
IfやSelect Caseが減るため、新しい状態を追加する際に既存のコードに影響を与えない (開拓閉鎖の原則)。
責務の分離
「状態の管理」と「その状態での処理」が別クラスに分割されるため、それぞれのコードが簡潔になる。
Visual Basic(VB.NET)実装例
オブジェクトが「通常 (Normal)」と「特別 (Special)」の2つの状態を持つ場合の実装例
Imports System
' 1. State(状態)インターフェース
Public Interface IState
Sub Handle(context As Context)
End Interface
' 2. ConcreteState(具象状態)- 通常状態
Public Class NormalState
Implements IState
Public Sub Handle(context As Context) Implements IState.Handle
Console.WriteLine("通常状態の処理を実行中...")
' 特別状態へ遷移するトリガー
context.State = New SpecialState()
End Sub
End Class
' 2. ConcreteState(具象状態)- 特別状態
Public Class SpecialState
Implements IState
Public Sub Handle(context As Context) Implements IState.Handle
Console.WriteLine("★特別状態の処理を実行中★")
' 通常状態へ遷移するトリガー
context.State = New NormalState()
End Sub
End Class
' 3. Context(文脈)クラス
Public Class Context
' 現在の状態を保持
Public Property State As IState
Public Sub New(initialState As IState)
Me.State = initialState
End Sub
' 状態に応じた処理を実行
Public Sub Request()
State.Handle(Me)
End Sub
End Class
' --- 実行例 ---
Module Module1
Sub Main()
' 初期状態を「通常」に設定
Dim context As New Context(New NormalState())
' 処理を呼び出す(状態が自動で切り替わる)
context.Request() ' 通常処理 -> 特別状態へ遷移
context.Request() ' 特別処理 -> 通常状態へ遷移
context.Request() ' 通常処理 -> 特別状態へ遷移
End Sub
End Module