Latest web development tutorials

状態パターン

ステートモード(状態パターン)では、クラスの振る舞いは、その状況に基づいているが変更されました。 デザインパターンのこのタイプは、行動パターンに属します。

状態モデルでは、我々は、オブジェクトとコンテキストオブジェクトの表現を変更されたオブジェクトの状態が変化するとともに、行動の種々の状態を作成します。

入門

意図:内部状態での動作を変更するオブジェクトが変更されることができ、オブジェクトは、そのクラスを変更するために表示されます。

主に解決するために:オブジェクトの動作をその状態(属性)に依存しており、あなたはその状態に関連した行動の変化に応じて変更することができます。

使用するとき:コードは、条件文の状況に関連する多数のオブジェクトが含まれています。

修正方法:特定のクラスを抽象化の状況。

キーコード:通常はコマンド・モード・インターフェース1つの方法だけ。1つまたは複数のメソッドを持つインターフェイスのステータス。 また、実装クラスの状態モード、通常、戻り値、またはのメソッドは、インスタンス変数の値を変更します。 すなわち、状態オブジェクトモデルの状態は、一般的に適切です。 実装クラスのメソッドは、インターフェースのメソッドを覆う異なる機能を有しています。 状態モードと同じコマンドモードは、他の条件の場合...他の選択ステートメントを除去するために使用することができます。

応用例:1、バスケットボール選手を再生すると、通常の状態ではなく、正常な状態と異常な状態を持つことができます。2、曽の鐘の侯爵李氏は、「クロックA 'と他の特定の状態、「編鐘」特定の環境(コンテキスト)」クロックは、抽象インタフェースです」。

利点:1、変換ルールをカプセル化します。列挙状態は種の状態を判断する必要がある前に2、可能な状態を列挙します。 3、クラスへの状態関連の動作を持つすべての、あなたは簡単に新しい状態を追加することができますが、唯一のオブジェクトの動作を変更することができ、オブジェクトの状態を変更する必要があります。 4、いずれかのオブジェクトの状態遷移論理状態を可能にする、条件文のではなく、一つの巨大なブロック。 図5は、複数のオブジェクトは、それによって、システム内のオブジェクトの数を減らす、状態オブジェクトの環境を共有することができます。

短所:1は、使用状態パターンは、システムのクラスとオブジェクトの数を増加させるために結合されています。正しく使用しない2、状態パターンの構造と実装は、より複雑で混乱プログラム構造とコードを引き起こす可能性があります。 新しいクラスを追加する3、状態パターン」オープンクローズドの原則は、「非常に良いではありません、あなたは状態モデルの状態を切り替えることができるためのサポートは、ソースコードの状態遷移の責任者のステータスを変更する必要がある、または新しい状態に切り替え、変更することはできません状態クラスの行為はまた、対応するクラスのソースコードを変更する必要があります。

使用シナリオ:1、状態変化の挙動やシーンの変化に。2、条件分岐文で代用。

注:ステートモードにより拘束状態の動作を使用して、その状態を5以上でないとき。

実現

我々は国家のエンティティのステータスインタフェースと実装クラスの状態インターフェイスを作成します。コンテキストは、特定状態を持つクラスです。

StatePatternDemoは、我々は変化の状態の挙動変化を実証するために、クラスやステータスコンテキストコンテキストオブジェクトの使用を示します。

状態パターンUMLダイアグラム

ステップ1

インターフェイスを作成します。

State.java

public interface State {
   public void doAction(Context context);
}

ステップ2

インターフェイスを実装するエンティティクラスを作成します。

StartState.java

パブリッククラスSTARTSTATEは{状態を実装します

   公共ボイドのdoAction(コンテキストコンテキスト){
      System.out.println( "Playerが起動状態にあります");
      context.setState(この);	
   }

   公共の文字列のtoString(){
      「スタート状態」を返します。
   }
}

StopState.java

public class StopState implements State {

   public void doAction(Context context) {
      System.out.println("Player is in stop state");
      context.setState(this);	
   }

   public String toString(){
      return "Stop State";
   }
}

ステップ3

Contextクラスを作成します。

Context.java

パブリッククラスコンテキスト{
   プライベート状態state;

   公共コンテキスト(){
      状態= NULL;
   }

   公共ボイドSETSTATE(状態state){
      this.state =状態。		
   }

   公共州立getStateを(){
      状態を返します。
   }
}

ステップ4

状態が状態の変更を変更したときの動作を確認するためにコンテキストを使用してください。

StatePatternDemo.java

パブリッククラスStatePatternDemo {
   公共の静的な無効メイン(文字列[] args){
      コンテキストcontext =新しいコンテキスト();

      STARTSTATE STARTSTATE =新しいSTARTSTATE();
      startState.doAction(コンテキスト)。

      System.out.println(context.getState()のtoString());

      StopState stopState =新しいStopState();
      stopState.doAction(コンテキスト)。

      System.out.println(context.getState()のtoString());
   }
}

ステップ5

出力を確認します。

プレイヤーは、開始状態であります
スタート状態
プレイヤーは、停止状態にあります
停止状態