State

state.png

Stateパターンを実装するのに必要な材料

状態マシンとは?
状態 enumかint型定数で表現
アクション
状態変数 int型で現在の状態を保持する

アクションとは、状態に変化をもたらすための動作のこと。

やること

状態に応じてやりたい振る舞いを分岐させる
たとえば、FFのステータス風にすると

if(){
    現在のHP-=最大HP*0.1;
}else if(スロウ){
    行動速度*=0.5;
}else if(暗闇){
    命中率*=0.5;
}

てなかんじです。

後で状態を増やすと、あちこちのコードを修正しなきゃいけない??

たとえば、後で「沈黙」という状態を増やすとする。
「魔法を使えない」というコードを書き足せばいい。
しかし、他に状態に応じてif文で分岐する、状態を示す絵のエフェクトを出すコードがどこかにあったとする。
それも修正しなきゃならない。
ああ、めんどくさい。
そう、状態が増えると面倒くさいです。

状態をクラス化する

となると材料はこうなります。
状態インタフェース
状態クラス
状態 enumかint型定数で表現
アクション
状態変数 int型で現在の状態を保持する

たとえば、毒状態を示すクラスはこうなる。

class Poison implements Status{
    @Override
    public void visualEffect(){
        //緑のあわあわを頭上に出す
    }
    @Override
    public void effect(){
        現在のHP-=最大HP*0.1;
    }
}

StateとStrategyの違い

State Strategy
オブジェクトの内部状態を変えることで振る舞いを制御する 交換可能なアルゴリズムを取り組くむ
一連の振る舞いを状態オブジェクト内にカプセル化する
いかなる時でもコンテキストがそれらの状態の一つに委譲している コンテキストオブジェクトに最適な戦略オブジェクトが存在する
クライアントは状態オブジェクトについて非常にわずかしか知らない クライアントはコンテキストを構成する戦略オブジェクトを指定する
多数の条件文を使うことに対する代替手段 サブクラス化に対する柔軟な代替手段

switch

サポートサイト Wikidot.com switch