デザインパターン-State

Stateパターンとは

Stateパターンとは、状態をクラスで表現して、状態の変化に応じて振る舞い(処理)を変化するパターンです。

状態を表現するオブジェクトが、内包するその状態オブジェクトを切り替えることにより、処理内容(振る舞い)を変えられるようにします。

「State」とは「状態」を意味します。


状態1つに対してクラス1つで表現して、状態と処理を分割することで可読性のあるソースコードとなります。


構成要素

  • State(状態)
    • 状態を表すクラスです。
    • 状態毎に振舞いが異なるメソッドのインタフェースを定義します。
  • ConcreteState(具体的な状態)
    • 具体的な状態を「1クラスにつき1状態」で定義します。
  • Context(状況判断)
    • 現在の状態を保持します。
  • Client(利用者)

rubyによるStateパターンの実装


#!/usr/bin/env ruby

# 状態を表すクラス
class State
  def description
    raise "not implemented error."
  end
end

# 具体的な状態を「1クラスにつき1状態」で定義します。 
class RunState < State
  def description
    return("running ...")
  end
end

# 具体的な状態を「1クラスにつき1状態」で定義します。 
class SleepState < State
  def description
    return "sleeping ..."
  end
end

# 状況判断:現在の状態を保持します。
class Context
  def initialize
    @st_run   = RunState.new
    @st_sleep = SleepState.new
    @state    = @st_sleep
  end

  # 状態の切り替え
  def change_state
    if(@state.class == SleepState)
      @state = @st_run
    else
      @state = @st_sleep
    end
  end

  def description
    puts(@state.description)
  end
end

obj = Context.new
obj.description
obj.change_state
obj.description
obj.change_state
obj.description


関連ページ