読者です 読者をやめる 読者になる 読者になる

プログラミングの魔物

エラー、バグ、仕様変更と戦うブログ

19.State 状態をクラスとして表現する

同一のインターフェースを持ったクラスを状態ごとに作成する。状態に応じてクラスを切り替えることで、状態の変化を表すと同時に状態に応じた振る舞いを表現する。

f:id:p-monster:20121218195838p:plain

State・・・状態に依存した振る舞いをするAPI
ConcreteState・・・Stateの実装。
Context・・・現在の状態を表すConcreteStateを持つ。Stateパターンの利用者に必要なAPIを定める。

分割して統治・・・大きな問題をそのまま解かず、小さな問題に分ける。簡単に解ける問題になるまで小さくする。大きくてややこしい1つの問題よりも、小さくて優しい問題をたくさん解く。
ifだと状態の種類が増えると条件分岐が複雑になる。Stateパターンだと状態に応じた条件分岐が不要になる。
自己矛盾が起こらない。
新しい状態を追加するのは簡単。

関連しているパターン

Singleton・・・ConcreteStateはSingletonとして実装される場合がある。
Flyweight・・・状態を表すクラスはインスタンスフィールドを持たないのでFlyweightパターンを使ってConcreteStateを複数のContextで共有できる場合もある。

参考:

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門