StateパターンおよびContextのインターフェイス

id:fkmさんの書かれた当該エントリはd:id:fkm:20061125。
StateパターンのContextをインターフェイスとすべきか否か。

で、fkmさん曰く元ネタは結城先生のデザパタ本ということなのだが、
残念ながら私はデザパタ本は所持しておらず中身まではわからない。
(と思ったら結城先生の許諾を得てWebにほぼ同じようなコードを書いてらっしゃる方がいた)
元のコードらしきものをみると、確かにContextがインターフェイスとして定義されている。


一般に複数のクラスで処理の手続きを統一するのであれば
インターフェイスにする必要があるが、
そうでない状態ではインターフェイスにする必要は無い。
(後の拡張を考えてインターフェイスにすることはある)
この場合、インターフェイスを実装するクラスとインターフェイスとを
扱うクラスの関係が疎になるため、疎結合なクラス関係を構築する場合にも有用である。


Stateパターンの場合、ContextとStateの関係がどうなるかを考える。


ContextはStateの処理を行う手続き以外の詳細を知る必要は無い。
StateはContextの保持するStateインスタンスを変化させる必要がある。
したがって最低限Contextクラスの状態遷移方法を知る必要がある。


ここで問題になりそうなのが、状態遷移を行う条件である。
状態遷移を行う条件には


・状態遷移前の事前条件
・処理が行われるための実行条件
・処理が行われた結果による事後条件


が存在する。


これらが全てStateクラス内部および処理実行時の引数として隠蔽されるのであれば
StateクラスはContextの状態遷移を行うための手続きのみを知っていれば良いことになる。
(仮に情報をContextにもたせたとするとStateはContextの詳細を知らなければならない)


したがって、Stateクラスおよび処理を行うトリガーとなる情報に全ての状態遷移条件が
隠蔽されるのであれば、Contextクラスをインターフェイスとして使用することが可能となる。