序文
今日は戦略パターン[Stragetyパターンを見て[行動] ]、このモデルは非常によく理解されています。戦略はどのようにそれを理解するには?:一般的にはを参照 1. プログラムのセットの目標を達成することができます; 2 ;状況の闘争と開発のアクションメソッドと策定3 の方法と手段に注意を払うように、芸術的闘争。全体的には、異なる目的のためにメソッドのコレクションです。ここではそれを理解するためにどのような戦略パターンについて話をしますか?簡単に言えば、それは実行時に変更することができますクラスまたはその置換アルゴリズムを実施することです。
戦略モードの紹介
まず、その理由
ソフトウェアシステムでは、いくつかのアルゴリズムは、これらの変更のアルゴリズムがオブジェクトに書かれている場合は、そのオブジェクトが複雑で分かりにくくなる、オブジェクト、または動作が頻繁に変更されることがあります。それでは、どの実行時に我々の異なるアルゴリズムを動的にそのオブジェクトを変更できますか?これは、戦略パターンを使用することです。
第二に、意図
一連のアルゴリズムを定義し、それらを一つ一つをカプセル化し、それらが交換可能になります。
第三に、図の場合。
第四に、戦略パターンのコード例
モデルはやや似ている状態で描画するようなケースとケースの上にチャートを参照してください。彼らは、3つの部分に含まれています。具体的な違いは、私たちは詳細に背中を参照してください。
環境の役割:戦略を保持することが含ま抽象ポリシー参照を。
要約戦略:異なるアルゴリズムを達成するための具体的な戦略により、一般的な方法を定義します。
具体的な戦略:抽象インタフェースのメソッドを達成するための戦略。
ここでは、スーパーでものを購入するために、そのような場合を参照してください。会員がある場合に決済が求められますとき最後に、いくつかの決済のメカニズムがあります。一般ユーザのフルコスト。定期演奏 95 倍。ゴールドはヒット9 倍に。ダイヤモンドはヒット8 倍に。私たちは、この機能を実現する方法を見て:
名前空間Stragety_Pattern { クラスStragetyPattern { } #region アブストラクト================== /// <まとめ> /// 抽象ポリシーインターフェース /// </要約> パブリック インターフェイスIStragetyPattern { /// <まとめ> /// 課金インタフェース /// </要約> ボイド決済(小数 マネー); } #endregion #region 特定戦略================ ======= /// <要約> /// 計算していない会員 /// </要約> パブリック クラスOrdinaryStragety:IStragetyPattern { 公共 ボイド決済(小数点 マネー) { Console.WriteLineを($ " 会員でない、{}決済支払金を割り引いてはいけません。" ); } } /// <要約> /// メンバーは、コンピューティング実施形態 /// </要約> パブリック クラスMemberStragety:IStragetyPattern { 公共 ボイド決済(小数点 マネー) { Console.WriteLineを($ " 普通のメンバー95は、{} * 0.9Mを課金債務のマネー意気投合。"); } } /// <要約> /// ゴールド計算 /// </要約> パブリック クラスGoldMemberStragety:IStragetyPattern { 公共 ボイド決済(小数点 マネー) { Console.WriteLineを($ " 10%オフゴールド、決済買掛金マネー* 0.95M} { " ); } } /// <要約> /// 計算ダイヤモンド /// </要約> パブリック クラスDiamondGoldMemberStragety:IStragetyPattern { 公共 のボイド決済(小数 マネー) { Console.WriteLineを($ " ダイヤモンド会員は、* 8倍の決済がお金を債務0.8Mを打つ} {。" ); } } #Endregion #region 環境役割 パブリック クラスContextStragety { プライベートIStragetyPattern _stragety; 公共ContextStragety( stragety IStragetyPattern) { _stragety = stragety; } /// <まとめ> /// コールの課金方法 /// </要約> /// <PARAM NAME = "マネー"> </ PARAM> 公共 のボイド GetSettlement(小数 マネー) { _stragety.Settlement(マネー); } } #endregion }
名前空間Stragety_Pattern { クラスプログラム { 静的な 無効メイン(文字列[] argsを) { 小数アカウント= 190.99M ; /// 計算のメンバー ContextStragetyのstragetyを= 新しい新しい ContextStragety(新新MemberStragety()); stragety.GetSettlement(アカウント); /// ノーマル請求 stragety = 新しい新しい ContextStragety(新しい新しいOrdinaryStragety()); stragety.GetSettlement(アカウント); } } }
ここでは、交換可能に計算され、最終的な決済金額の時間に焦点を当てました。特定のポリシーでは、我々はカプセル化されたアルゴリズムの変更を考えているので。
使用シナリオと長所と短所
まず、シナリオの使用
いくつかのクラスがシステムに存在する場合1、、両者の差は、言葉のその行為にあります。あなたは、Strategyパターンは、オブジェクトは動的挙動の数でアクションを選択することができます使用することができます。
2、システムは、様々なアルゴリズムのどちらかを選択する必要があります。
3.オブジェクトが行動をたくさん持っている場合は、ステートメントを選択し、複数の条件を簡素化することができます。困難なメンテナンスの問題を避けてください。
第二に、利点
図1は、自由に実装されているポリシーに抽象クラスポリシーの方法として、ポリシークラスの間で切り替えることができます。だから、自由に切り替えることができます。
図2は、拡張が容易な、コードの前に時間で私たちの新しい戦略は、基本的に変更する必要はありません。
図3に示すように、複数の条件が単純化されたステートメントを最適化するように選択されているため
第三に、欠点
1、政策の増加に伴い、ポリシークラスが増加します。
2、クライアントは、すべてのポリシーのクラスを知っている必要がありますし、使用する戦略を決定します。
概要
ここでの戦略パターンが完成し紹介します。戦略モードでは、一連のアルゴリズムのために主にあります。そして、一緒にすべてをパッケージ化。あなたはそれらを自由に切り替えることができます。これらのアルゴリズムは、クライアントの変更とは無関係に変更を加えます。つまり、カプセル化された様々な行為との間の変化です。私たちが呼ぶとき、呼び出しの自由度を切り替えることができます。
ここでは、最初のポリシーマップモードと状態モードで言及やや似たようなケースがあります。ここでは、戦術パターンモードとステータスバーの一部の間の違いの分析に焦点を当てます:
1、異なるタスクにおける環境の役割、政策モード委員会の役割に役割を持っている環境では、ポリシーに従って渡されたアルゴリズムを呼び出すための責任があります。しかし、ステート・モード動作での環境の役割は、このメソッドを呼び出すための唯一の責任を負いません、それはまた、記録状態が変化し、特定の状態を持つクラスのコラボレーションを担当しています。スイッチの動作を切り替えた後に完了ステータス。
図2に示すように、戦略パターンが主な問題は、外部の内部アルゴリズムの変化の影響を低減することです。無料のハンドオーバーアルゴリズムを保証します。ステート・モード主なソリューションは、状態は、それが行動変容かのように思えるの外部からのオブジェクトの状態の変化を、行動の変化を引き起こす変更することです。
3、戦略モードは、梱包の方法です。ここでパッケージ化アルゴリズムは、意味のあるオブジェクトであってもよいし、論理的に無意味な断片であってもよいです。ここでは、例えば、暗号化アルゴリズムをカプセル化。様々な暗号化アルゴリズムは、自由に切り替えることができます。アルゴリズムは平行でなければなりません。状態モデルは、行動と変化してステータスバーの変更の一部を依頼することです。状態と行動が必要。
でも怪我をするだけでなく、彼の頭を上げ、笑顔、素敵な天気の今日と述べました。
次のFanger魏コードをスキャンするためにようこそ、と私はデザインパターンが通過する道に足を踏み入れました!