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