ステート・モード
モード状態(状態パターン)、クラスの振る舞いは、その状態変化に基づいています。デザインパターンのこのタイプは、行動パターンを属します。
状態モデルでは、我々は、オブジェクトの状態が変更されるように、コンテキストオブジェクトは、様々なオブジェクトの挙動と変化の様子を表して作成します。
入門
意図:内部状態が変更されたときにオブジェクトがその動作を変更することができ、オブジェクトは、そのクラスを変更するように見えます。
主液:オブジェクトの挙動は、その状態(性質)に依存しており、その関連状態に基づいて動作を変更するために変更されてもよいです。
ときに使用する:コードは、オブジェクトの状態に関する条件文の数が含まれています。
解決方法:特定の状態クラス抄録の様々な。
キーコード:一方向のみのインターフェースは、典型的には、コマンドモードです。界面準モードの一つ以上の間。さらに、クラスのメソッド実装状態モード、通常の戻り値、またはインスタンス変数の値を変更します。換言すれば、状態およびオブジェクトモデルの状態は、一般的に関連しています。実装クラスのメソッドは、インターフェースを被覆する方法が異なる機能を有します。状態モードとコマンドモードも他の条件であれば...他の選択文を排除するために使用することと同じことができます。
応用例: 1、バスケットボールの選手を再生するには、通常の異常や異常な状態のステータスを持っています。図2は、編鐘は、「クロックA」「クロックは、抽象インタフェースである」と特異的状態であるように、「編鐘「、特定の環境(コンテキスト)。
利点: 1、変換ルールパッケージ。2は、可能な状態を列挙し、列挙する前の状態にある種のステータスを確認する必要があります。3、クラスに状態関連の振る舞いを持つすべての、あなたは簡単に新しい状態を追加することができますが、唯一のオブジェクトの動作を変更することができ、オブジェクトの状態を変更する必要があります。図4は、むしろ一つの巨大な条件文ブロックよりも、いずれかのオブジェクトの状態遷移論理状態を可能にします。図5は、環境は、複数のオブジェクトが、それによって、システム内のオブジェクトの数を減らす、状態オブジェクトを共有することができます。
短所: 1、状態モデル系を使用して、必然的にクラスとオブジェクトの数を増加させます。2、構造及び状態モデルの実装では、混同構造とプログラムのコードをもたらす誤っ使用される場合、より複雑です。3、「開閉原則」の状態モードのサポートは、モードの状態のための非常に良いではありませんが、新しいクラスを追加し、状態を切り替えることができる状態遷移の責任者のソースコードのステータスを変更する必要がある、または新しい状態に切り替え、変更することはできません。クラスに対応するクラスの動作状態は、ソースコードを変更する必要があります。
使用シナリオ: 1、変化挙動やシーンの変化状態に応じて。2、条件、代わりのswitch文によります。
注:これ以上5以下の使用状態モードの動作は状態によって制約、および状態。
実現
私たちは、作成する 状態 のインタフェースと実装 状態の エンティティの状態のクラスインターフェイスを。コンテキストは、 状態を持つクラスです。
StatePatternDemo、私たちのデモクラスが使用 コンテキスト コンテキスト状態変更における行動の変化を実証すると状態のオブジェクトを。
ステップ1
インターフェイスを作成します。
State.java
公共ボイドのdoAction(コンテキスト・コンテキスト)
}
ステップ2
インタフェースを実装するエンティティクラスを作成します。
StartState.java
公共空のdoAction(コンテキストコンテキスト){
System.out.printlnは(「プレイヤーは、スタート状態です」);
context.setState(この);
}
パブリック文字列のtoString(){
戻り「スタート状態」。
}
}
StopState.java
公共空のdoAction(コンテキストコンテキスト){
System.out.printlnは(「プレーヤーが停止状態です」);
context.setState(この);
}
パブリック文字列のtoString(){
戻り「停止状態」。
}
}
ステップ3
作成 コンテキスト クラスを。
Context.java
プライベート州状態。
公共コンテキスト(){
状態=ヌル。
}
公共ボイドSETSTATE(ステート状態){
this.state =状態。
}
公共状態getStateを(){
復帰状態;
}
}
ステップ4
使用 コンテキスト ビューに状態 状態の 変更がしたときの動作を変更。
StatePatternDemo.java
パブリック静的無効メイン(文字列[] args){
コンテキストコンテキスト=新しいコンテキスト()。
STARTSTATE STARTSTATE =新しいSTARTSTATE();
startState.doAction(コンテキスト)。
System.out.println(context.getState()のtoString())。
StopState stopState =新しいStopState();
stopState.doAction(コンテキスト)。
System.out.println(context.getState()のtoString())。
}
}
ステップ5
プログラム、出力の実装:
プレイヤーはあるにスタート状態スタートステートプレーヤーがある中で、停止状態停止状態