おそらく読んだことがあると思いますが、State Design Patternは、構成要素にその状態が含まれるオブジェクトの動作が状態によって変化する場合に役立ちます。これは、一般的な動作や必要なメソッドを定義するState
抽象クラス、インターフェイス、または列挙型のアイデアを意味します。
主な側面
状態パターンを扱う際には、列挙と遷移という 2 つの重要な側面を考慮する必要があります。列挙とは、可能な状態のセット (曜日など) を特定すること、またはワークフロー エンジンの開始、終了、中間など、より抽象的な状態の種類 (メタ状態) を特定することを意味します。遷移とは、動きをモデル化する方法を決定することを意味します。これは通常、表形式の表現 (つまり、Finite State Machine ) ですべての可能な遷移をキャプチャするか、各状態に他の状態への可能な「遷移」を知らせることによって行われます。
通常、トランジションはメタ ステートと密接に関連しています。これは、実行時に新しいステート、つまりトランジションを追加できるような動的システムでは、すべてのステートと関係を事前に知ることができないためです。さらに、遷移アプローチでは、状態自体ではなく、特定の動作 (通知など) が遷移の一部になります。
例
私が取り組んだ、またはこれが使用施設である場所について議論したいくつかのシナリオがあります。
- ワークフロー
- コンピューターゲーム対戦相手AI
- プロセスのオーケストレーション
ワークフローとは、 jBPMのようなものを意味します。このようなシステムは、適切な人に適切なタイミングで適切な注意を向けさせることに関心があります。彼らは通常、大量の電子メールまたはその他の種類の通知を送信します。また、それらが表すプロセスは、組織の変化に応じて変更できる必要がありますが、管理対象のデータは通常、よりゆっくりと変化します。
コンピューター ゲームの対戦相手 AIは一目瞭然です。私が書いたものではありませんが、持っている人たちとの会話では、これらのシステムは通常自己完結型です。つまり、ワークフローとは異なり、ゲームには通常、コンピューターの対戦相手を制御するために使用されるプロセスを変更する機能がありません。
プロセス オーケストレーションはワークフローに似ていますが、人とのやり取りではなく、システム統合に重点を置いています。Apache Muleフレームワークは一例です。ここで状態は、ステータス (開始、進行中、終了など) とタイプ (ftp 統合ポイント、SQL 統合ポイントなど) を表すことができます。
結論
他の回答とは異なり、状態のカプセル化はソフトウェア システムの変更を管理する優れた方法だと思います。うまくいけば、これらの変更が容易になり、ユーザーが実行時に変更できるようになります。実装の複雑さが増すのと引き換えに、柔軟性を高めるというトレードオフを行います。そのため、このようなアプローチは、たとえばショッピング カートではおそらく役に立たないでしょう。たとえば、動作が非常によく知られており、変更したくない場合です。一方、プロセスが変更される可能性がある場合は、非常にうまく適合します。