戦略モードと状態モード:本論文では、同様のデザインパターンの振る舞いを説明するために、2つの構造を比較します。それを学ぶためにデザインパターンを使用することは困難で、個々の理解と学習の両方が比較的直感的でシンプルですが、それを実際に使用するには良い方法ではありません。これはまた、一緒に両方の導入の理由である、実施例及び比較説明を通じて、私はそれがより深い知覚の一部であるべきと考えています。最後に、個人的な経験の組み合わせは、単にこれら2つのモードのビューのいくつかについて話しています。
1.コンセプトモデル
1.1 Strategyパターン
実行時の挙動やアルゴリズムの変更などを、その機能を変更することの目的を達成するように。
使用シナリオ: システムは、動的にいくつかのアルゴリズムのいずれかを選択する必要がありますが、これらのアルゴリズムは、彼らの行動の間でのみ異なっています。また、あまりにも多くの意思決定プロセスは他の場合には、あなたも、このモードを使用することを検討することができますが発生します。
実装:これらのアルゴリズムは、そのような別の操作としてパッケージ化することができる所望のようにユーザに置き換えること。
利点: より、柔軟でスケーラブルな、もし他の構造の多くを避けます。
短所: 外国人は、過剰な行動のポリシークラスの拡張で、その結果、すべてのアクションとアルゴリズムのクラスを露呈しました。
1.2ステータスモード
その状態の決定により、ランタイムクラスの振る舞い。
使用シナリオ: オブジェクト依存の充電動作の状態変化のシナリオに応じて変更、または他の場合は分岐構造の数が多いなど。
実装:単一のパッケージにオブジェクト・クラスの状態、トランザクション処理状態の各状態、及び他の状態への状態遷移を制御します。
利点: 他の大型構造物を避ける場合は、新しい状態、状態遷移規則のパッケージを追加するのは簡単では、各状態は多重化と共有しても良いです。
短所: モデル構造及び状態の過度の上昇にオブジェクトおよびクラスの数を得、比較的複雑なを達成します。それぞれの状態に加え、新しい状態によって制御される他の状態への移行に伴う同時に、ステートマシンで有効にする状態の既存の一部に参加するように変更する必要があります。
1.3類似点
動作状態の両方によって小さなコンポーネント、交換機能条件のシリーズに分割し、開閉の原理に沿って、簡単に膨張するように、述べています。また、利用可能な場合や、他の代替ブランチとして、サポートされる最大の行動や状態が限られています。
1.4の違い
- 戦略モード、クラスの機能は、現在の状況に基づいて変更するためのイニシアチブを取ることです。
- 状態モードは、受動機能クラスは、現在の状態によって変化します。
- 各アクションまたはポリシーモードアルゴリズムとの間には関連しません。
- ステータスモード状態、状態自体及び状態遷移制御との間の関連付け。
2.原理
二つのモードは、次の2つのデザインパターンでは、それぞれ、図UMLクラスの外観の構造に非常に似て:
戦略モードUML 2.1
説明:
コンテキスト:
戦略のいくつかの種類を使用し、彼らの行動によって、特定の政策決定が含まれ、クラスがその動作を変更するために使用するポリシーを変更するためのイニシアチブを取ることができます。
戦略:
すべてのサポートされているアルゴリズムのための共通のインタフェースを定義する抽象戦略クラス。
ConcreteStrategy:
コンテキスト具体的な戦略を使用することができます。
UML 2.2ステート・モード
説明:
コンテキスト:
現在の状態の挙動を決定するステータスフラグクラスと、状態遷移は、クラス状態によって制御されます。
状態:
すべてのパブリックインターフェイスのコンテキストの状態を定義するための抽象状態クラス、。
ConcreteState:
いくつかのコンテキストクラス、トランザクション処理を含む、彼へのこの状態の状態遷移を制御する特定の状態。
3.例 - Strategyパターン
例えば圧縮ソフトウェアは、異なる圧縮戦略を使用しています。
抽象戦略インタフェース:圧縮
パブリック インターフェース圧縮{ 公共 ボイドdoCompression(); }
高速圧縮アルゴリズム:高速
パブリック クラス急速に実装して圧縮{ @Override 公共 無効doCompression(){ System.out.printlnは(「使用の急速な圧縮戦略を!」); } }
効率的な圧縮アルゴリズム:効率的な
パブリック クラス効率的な実装の圧縮{ @Override 公共 ボイドdoCompression(){ System.out.printlnは(「使用効率的な圧縮戦略!」); } }
暗号化圧縮アルゴリズム:暗号化
パブリック クラス暗号化を実装して圧縮{ @Override 公共 無効doCompression(){ // TODO自動生成されたメソッドスタブ のSystem.out.println(「使用の暗号化圧縮戦略を!」); } }
圧縮アルゴリズムのソフトウェア上の統合:WinRARの
パブリック クラスWinRARの{ プライベート圧縮圧縮= nullを。 公共WinRARの(圧縮圧縮){ この .compression = 圧縮。 } 公共 ボイドsetStrategy(圧縮圧縮){ この .compression = 圧縮。 } 公共 ボイド圧縮(){ 場合(圧縮!= NULL ){ compression.doCompression()。 } } }
デモ:
パブリック クラスデモ{ 公共 静的 ボイドメイン(文字列[]引数){ WinRARのWinRARの = 新しい WinRARの(新しいラピッド())。 winrar.compression(); winrar.setStrategy(新しい効率的な()); winrar.compression(); winrar.setStrategy(新しい暗号化()); winrar.compression(); } }
結果:
急速圧縮戦略を使用してください! 効率的な圧縮戦略を使用してください! 暗号化圧縮戦略を使用してください!
この例では、非常に直感的に見えますが、後者は少し分析し、個人的な理解を得られます。
4.例 - 状態モデル
私たちは、自動洗濯機の作業プロセスを介して状態を記述するためのモデルを使用しています。
簡単にするために、我々は考慮します[スタート] - > [仕事] - > [終了]、これらの三つの状態。
UMLのクラス図では、その最初の外観を以下に示します。
インターフェースの抽象状態:状態
パブリック インターフェースの状態{ 公共 ボイドdoJob(洗濯洗浄)。 }
ステータスを起動します。スタート
パブリック クラススタートは、実装状態{ @Override 公共 ボイド{doJob(洗濯洗浄) のSystem.out.println(「!衣類の洗濯を開始します」); washing.setState(新しい仕事()); washing.request(); } }
作業状況:仕事
パブリック クラス作業は実装状態{ @Override 公共 のボイドdoJob(洗濯洗浄){ System.out.printlnは(「今の作業します!」); washing.setState(新しいエンド()); washing.request(); } }
終了状態:終了
パブリック クラス終了は実装状態{ @Override 公共 ボイドdoJob(洗濯洗浄){ System.out.printlnは(「!すべての完成を」); washing.setState(NULL )。 } }
洗濯機カテゴリー:洗濯
パブリック クラス洗濯{ プライベートステート状態= nullを。 公共 ボイドSETSTATE(ステート状態){ この .state = 状態。 もし(状態== nullの){ System.out.printlnは( "現在の状態:!ヌル" ); } 他{ System.out.printlnは( "現在の状態:" + 。state.getClass()のgetName())。 } } 公共 ボイド要求(){ 場合(状態!= NULL ){ state.doJob(この); } } }
デモ:
パブリック クラスデモ{ 公共 静的 ボイドメイン(文字列[]引数){ 洗濯洗浄 = 新しい洗浄()。 washing.setState(新しいスタート()); washing.request(); } }
結果:
現在の状態:state.Start スタート服を洗濯! 現在の状態:state.Work ワーキング今すぐ! 現在の状態:state.End すべて完了しました! 現在の状態:ヌル!
洗浄は提供し、ユーザが使用するプライマリインターフェイスを。最初に、ユーザは、洗濯の構成状態を使用し、洗濯にコマンドを送信することができ、その後のユーザーが直接特定の一過性に対処する必要はありません。各状態は、自動的に実行終了するまで、次の状態に制御を転送します。
5.まとめ
個人的なデザインパターンとステータスパターンのいくつかを理解するための戦略(必ずしも右、ちょうどいくつかの考え)についての講演:
5.1戦略モード:
a)は頻繁に使用し、他の場合は、真剣に消費パフォーマンスができました
戦略モードでは、スイッチングがランダムな条件に基づいて行われます代わりに、行動クラスは、多くの場合、いずれかのモードで動作し、より適しています。
例えば、APPの開発プロセスは、特定の機能はとにかく画面の状態に依存するので、我々は他の水平または垂直スクリーンは、次に、プロセスの次のステップで、現在の画面の各フレームで判定された場合に使用する必要がありますか?
明らかに、これは、正しいアプローチは2つの戦略、画面が切り替わるたびに、どのようなモードを使用するには、アクティブカットに水平方向と垂直方向の画面分割に対処するために真剣に消費パフォーマンスですでしょう。
B)と戦略パターンを代わりに使用することができ、他の場合ではないすべての支店
上記の例の圧縮ソフトウェアについては、ユーザーがパターンを選択します、次の作品は、これは問題ありません。
私たちはさまざまな圧縮方法を使用してパラメータを渡すことができます圧縮コマンドであり、提供する場合、我々はどのようなユーザーがう入力パラメータ、どのようなモードを知らないので、しかし、そうでない場合に使用する必要があります。
C)なし政策戦略モードを
コア戦略のパターンではなく、対応する操作を実行する場合は他の条件判断を使用する条件を渡す、それらが直接使用される特定の条件の下で、個々に再使用可能であってもよい車輪の数に一連の動作に分割されます。
このような観点から、名前の値しないポリシーモードは、それだけでなく、現在の状況に基づいて、インテリジェントな、合理的な意思決定であるが、また、積極的な戦略の実行を選択するユーザーが必要です。これには利点がありますが、それはまた、より多くの何の戦略になりません。
呼び出し側が、私はあなたの実装を気にしないので、実際の開発プロセスは、我々はすべてお互いが使いやすいインターフェースを提供したい、最高の1インタフェースは、すべての問題を取得することができ、私は私を完了するために簡単な使用について、このインタフェースを気にそれは必要です。
根本的な理由は、同時にスケーラブルその分割成分による避けられない問題であるそのブレークカプセル化、打ち放しコンクリート戦略、である、エグゼクティブモデルによる政策決定は、発信者に進みます、コードは柔軟性と拡張性のあります同時に、使用が不便であるもたらします。
戦略パターンがあれば、他の意思決定の多くを避けることであれば、言語が、それは状況に応じて対応する操作を選択するために、直接キー、値としてハッシュテーブル、それぞれ、条件および機能のオブジェクトを使用することができますサポートしています。枝の数が多いために特に適しています。
そのため、実際の開発プロセスは、彼らの実際の状況に応じて比較検討する必要があります。
5.1戦略モード:
コア状態モデルは、各オブジェクトの状態であり、個々のオブジェクトの処理状態のために行われるべきであり、その状態によって他の状態への制御移行、動作クラスは、外側にユーザーフレンドリーなインターフェースを提供します。
拡張状態は特に友好的ではない、我々は他の州の転送を変更する必要があります。第二に、その実装は良いエラーが発生しやすいと、より柔軟です。
要約:
戦略モードでは、状態が実行時に発生する変更、状態によって状態オブジェクトの状態に現在のパッシブモード遷移を変更するには、コンテキストの動作を変更することを目指す意思決定に到達するためにオブジェクト自体が使用するアクティブな置換戦略です。
予めポリシーパッケージのパターンは、各セットは、異なる条件下で動的ニーズ及び状態モード処理の適切な選択に対処するために、さまざまな問題コンテキストオブジェクトの動作をアルゴリズムのファミリーを交互にすることができます。