状態定義:異なる状態、またはさまざまな行動。
ステータスモードを使用するタイミング
状態モードは、実際の使用でより一般的に使用され、「状態の切り替え」に適しています。 elseifが状態を切り替えるために頻繁に使用するため、この状態の判断が繰り返される場合、状態モードを採用できるかどうかを考える必要があります。
ステータスだけでなく、属性にも基づいています。オブジェクトのプロパティが異なる場合、これはデータベースシステムで頻繁に発生します。プロパティ、そのような変化(スイッチング)プロパティはいつでも発生する可能性があるため、状態を使用することが可能です。
実際に使用すると、スイッチに似た多くの状態スイッチがありますが、システムの経験と理解の深さに応じて、それほど明白ではない場合があります。
ここで説明したいのは、「スイッチの切り替え状態」と「一般的な状態判断」にも違いがあるということです。
コードコピーは次のとおりです。
if(this == 1)state = "hello";
else if(fhich == 2)state = "hi";
else if(fhich == 3)state = "bye";
これは「一般的な国家の判断」です。状態値の違いは、どの変数とは関係ありません。に変更した場合:
コードコピーは次のとおりです。
if(state.euqals( "bye"))state = "hello";
else if(state.euqals( "hello"))state = "hi";
else if(state.euqals( "hi"))state = "bye";
これは「スイッチスイッチング状態」です。これは、状態を「Hello」から「Hi」に切り替え、「hello」に切り替えるときです。状態を変更できます状態モードを使用します。
「hello " - >" hi " - >" bye " - >" hello "の方向を単に切り替えるだけでも、状態モードが多くを作成するため、必ずしも状態モードを使用する必要はありません。サブクラス。ただし、別の動作が発生した場合:倒立した方向を切り替えるか、自由に切り替える必要があります。
次の例をご覧ください。
コードコピーは次のとおりです。
パブリッククラスのコンテキスト{
プライベートカラー状態= null;
public void push(){
//現在の赤い状態が青に切り替えられている場合
if(state == color.red)state = color.blue;
//現在の青い状態が緑に切り替えられている場合
else if(state == color.blue)state = color.green;
//現在の黒い状態が赤に切り替えられている場合
else if(state == color.black)state = color.red;
//現在の緑色の状態が黒に切り替えられている場合
else if(state == color.green)state = color.black;
サンプルサンプル=新しいサンプル(状態);
sample.operate();
}
public void pull(){
//プッシュ状態の切り替えの正反対です。
else if(state == color.black)state = color.green;
else if(state == color.blue)state = color.red;
else if(state == color.red)state = color.black;
sample2 sample2 = new sample2(state);
sample2.operate();
}
}
上記の例では、これらの2つのスイッチアクションがコンテキストの色を変更する必要があります。
また、上記の例では、この特定の動作は非常に単純なものです。使用すると、サブクラスの数が増加し、シンプルで複雑になります。
例:銀行口座は、多くの場合、オープンステートとクローズ状態を切り替えます。
たとえば、TCPの古典的なTCPの状態には3つの状態があります。リスニングクローズと繰り返しの変換は、わずか1つまたは2つの文で完了することはできず、状態を使用するのに適しています。
たとえば、Mailbox Popアカウントには4つの状態があり、Hasusername認定を開始します。各状態の対応する動作は比較的大きく、状態の使用に適している必要があります。
たとえば、ツールボックスで異なるツールを選択すると、状態を使用するのに適した異なるツール間の切り替えと見なすことができます。たとえば、特定の図面プログラムがある場合、ユーザーはさまざまなツールを選択して、この状態を使用して状態を切り替えることができます。
状態モードの使用方法
州では、参加するには2種類のエンティティが必要です。
1.ステートマネージャーは、たとえば、上記の例のコンテキストです。
2。抽象クラスまたはインターフェイスによって実装された親クラスでは、異なる状態がこの親クラスの異なるサブクラスを継承しています。
上記のコンテキストを例として、それを変更して2種類のエンティティを作成したいと考えています。
最初のステップは、親クラスを作成することです。
コードコピーは次のとおりです。
パブリックアブストラクトクラスの状態{
パブリックアブストラクトボイドハンドルプッシュ(コンテキストC);
パブリックアブストラクトボイドハンドルパル(コンテキストC);
パブリックアブストラクトvoid getColor();
}
親クラスの方法は、州のマネージャーのスイッチの動作に対応する必要があります具体的に処理する必要があります。
以下は、特定のサブクラスの実装です。
コードコピーは次のとおりです。
パブリッククラスのBluestateは状態を拡張します{
public void handlepush(コンテキストc){
//プッシュメソッド「青の場合は緑に切り替える」によると。
c.setState(new GreenState());
}
public void handlepull(コンテキストC){
//プルメソッドによると、「青の場合は赤く切り替えます」;
c.setState(new Redstate());
}
パブリックアブストラクトvoid getColor(){return(color.blue)}
}
同様に、他の状態のサブクラスは青として実装されています。
2番目のステップは、この例のコンテキストである州のマネージャーを書き直すことです。
コードコピーは次のとおりです。
ublicクラスのコンテキスト{
Private Sate State = null; //元の色の状態を変更しました。
// setStateは、setStateを使用して状態状態を変更して状態の切り替えを達成するために使用されます
Pulic void setState(州){
this.state = state;
}
public void push(){
//この場合、状態の切り替えの詳細は、サブクラスのハンドルプッシュにカプセル化されている色の変化であり、state.handlepush(this)を気にする必要はありません。
//サンプルは状態でスイッチング結果を使用する必要があるため、getColor()を使用します
サンプルサンプル= new Sample(state.getColor());
sample.operate();
}
public void pull(){
state.handlepull(this);
sample2 sample2 = new sample2(state.getColor());
sample2.operate();
}
}
この時点で、州のリファクタリングプロセスを実装しました。
上記は、実際のアプリケーションでは、ハンドルプッシュまたはハンドルパルの取り扱いが複雑です。