やる気
- オブジェクトの状態が変化すると、その動作もそれに応じて変化します。たとえば、ドキュメントが読み取り専用状態の場合、ドキュメントでサポートされている動作と読み取り/書き込み状態でサポートされている動作はまったく異なる場合があります。
- 実行時の状態に応じてオブジェクトの動作を透過的に変更するにはどうすればよいですか?
パターン定義
内部状態が変化したときにオブジェクトの動作を変更できるようにします。これにより、オブジェクトの動作が変更されたように見えます。-「デザインモード」GoF
状態モデルは、内部状態が変化したときにオブジェクトの動作を変更できるようにするもので、オブジェクトはクラスを変更したように見えます。状態モデルは、オブジェクトの状態遷移を制御する条件式が複雑すぎる場合の状況を主に解決します。状態の判定ロジックを異なる状態を表す一連のクラスに転送することにより、複雑な判定ロジックを簡略化できます。
主なポイントのまとめ
- 状態モードでは、特定の状態に関連するすべての動作がStateのサブオブジェクトに入れられます。オブジェクトの状態が切り替わると、対応するオブジェクトが切り替わります。同時に、Stateのインターフェイスが維持され、特定の操作と状態遷移の関係が実現します。デカップリング。
- 変換はアトミックです
- 戦略モードに似ています
構造
このクラス図を見ると、戦略パターンのUML図と同じですか?
https://www.cnblogs.com/wkfvawl/p/12453747.html
これは実際のケースです。2つのモードは構造的に同じですが、意図は完全に異なります。戦略モードは、ユーザーが置換を指定できる戦略アルゴリズムであり、状態モードは、特定の条件下での状態の自動置換です。ユーザーは、状態を指定します。初期状態のみを設定できます。
ここでの説明はやや抽象的ですが、鮮やかな例が頭に浮かびましたが、少し汚いですが、言葉が荒れていませんので、ご覧になれます。
https://www.zhihu.com/question/23693088
基本コード
#include <iostreamの> 使用して 名前空間STD; クラスコンテキスト、 クラス状態{ // パッケージの特定の状態及びコンテキスト依存挙動にインタフェース定義する抽象状態クラス パブリック: 仮想 ボイドハンドル(コンテキスト* C)= 0 ; 仮想〜State(){} }; class Context { // 現在の状態として定義されているConcreteStateサブクラスのインスタンスを維持する private : State * state; public : Context(State * s){state = s;} void Request() { // //リクエストを処理し、次の状態を設定します state- > Handle(this ); } void SetState(State * s){state = s;} }; // 特定の状態クラス、各単語クラスはContextで状態を実装します関連する動作 クラス ConcreteStateA:public State { public : void Handle(Context * c); }; class ConcreteStateB:public State { public : void Handle(Context * c); }; class ConcreteStateC:public State { public : void Handle(Context *c); }; void ConcreteStateA :: Handle(Context * c){ cout << " ConcreteStateA " << endl; c- > SetState(new ConcreteStateB()); } void ConcreteStateB :: Handle(Context * c){ cout << " ConcreteStateB " << endl; c- > SetState(new ConcreteStateC()); } void ConcreteStateC :: Handle(Context * c){ cout << " ConcreteStateC "endl; c- > SetState(new ConcreteStateA()); } int main(){ State * s = new ConcreteStateA(); コンテキスト * c = 新しいコンテキスト; c- > Request(); // ConcreteStateA切换状态 c-> Request(); // ConcreteStateB c-> Request(); // ConcreteStateC delete s; cを削除します。 0を返し ます。 }
アプリケーションシナリオ
状態モードは、Stateのサブクラス間でさまざまな状態遷移ロジックを分散することにより、相互の依存関係を減らします。オブジェクトの動作がその状態に依存し、実行時に状態に従ってその動作を変更する必要がある場合は、状態モードの使用を検討できます。
利点:特定の状態に関連する動作をローカライズし、異なる状態の動作を分離します。