Stateパターン
Stateパターンは、要素を列挙する手段を独立させるデザインパターンです。
自分なりにStateパターンをクラス図にまとめてみました。
Stateパターンのクラス図
Stateパターンの解説
ContextクラスにState型の属性(クラス図ではstate)を用意する。この属性が、Contextクラスの状態を管理するオブジェクトになる。なのでこの属性のメソッド(クラス図ではhandleを指す)を呼び出せば、その状態での処理を実行できるようになる。
次にState型を定義するためのStateインターフェースを作成し、そこに抽象メソッド(クラス図ではhandle)を用意する。Stateインターフェースを継承する具象クラス(State1,2)を作成し、handleメソッドをオーバーライドする。例えばState1のhandleメソッドで、Contextのstate属性をState2に変更する処理を行うことで、次にContextオブジェクトが属性stateのhandleメソッドを呼び出すと、その時にはState2で定義したhandleメソッドが呼び出されることになる。さらにState2のhandleメソッドで、Contextのstate属性をState1に変更する処理を行うことで、再度Contextオブジェクトが属性stateのhandleメソッドを呼び出すと、今度はState1で定義したhandleメソッドを呼び出すことになる。
このように、定義したhandleメソッドがContext側の属性stateを変更できるようにするために、
・handleメソッドがStateオブジェクトを返し、その戻り値をContext側が属性stateに代入するという方法、
・handleメソッドの引数にContextオブジェクト自身を渡し、handleメソッドでそのオブジェクトのstate属性を変更するという方法
が考えられる。
Stateパターンをどういう場合に使うか
プログラムで状態管理をする場合に使えるが、webシステムなどでは1リクエストでstateが変わるような場合はあまり無く、複数リクエストの場合はセッションやクッキーを使えるので、それほど使う機会はないかもしれない。
ブラウザ操作やアプリ内で状態が切り替わることは考えられるので、そういった場合に使うとメリットがあると思われる。
PlantUMLでStateパターンのクラス図を記述する
文頭のStateパターンのクラス図をPlantUMLで書いたときのソースです。
@startuml State
interface State{
+ {abstract} handle()
}
class State1 implements State{
+ handle()
}
class State2 implements State{
+ handle()
}
class Context{
+ state : State
--
+ changeState()
}
Context o--> State
@enduml