戦略モード(Strategyパターン)
クラス行為、またはアルゴリズムを実行時に変更することができ、彼らはお互いを置き換えることができるように、このデザインパターンは、アルゴリズムの変更パッケージの最も中心点です。
騒ぎ、オンデマンドで最初:コモディティ統計のチェックアウトの購入価格ショッピング、そして元の価格に基づいて値引き、リベートや他のプロモーションの出現。
戦略パターンのクラス図
いくつかの戦略的なアプローチは、このコンテキストインターフェイスがインスタンス化される文脈によって、同じ抽象クラスからそれらのすべてを継承しています。
CashSuper戦略抽象クラス
クラスCashSuper {抽象 パブリックコンストラクタ(){ } パブリック抽象acceptCash(マネー:ナンバー); // 抽象メソッド配送ポリシー }
CashNormal正常な戦略
クラスCashNormalは{CashSuperを拡張 パブリックコンストラクタ(){ スーパー()。 } 公共acceptCash(お金:数):数{ 返すお金。 } }
CashRebate割引戦略
クラスCashRebateはCashSuperを拡張{ プライベートmoneyRebate:番号 = 1 。 パブリックコンストラクタ(moneyRebate:数){ スーパー()。 この .moneyRebate = moneyRebate。 } 公共acceptCash(お金:数):数{ お金 =お金* この.moneyRebate。 返すお金を。 } }
CashReturnクラスリベート
クラスCashReturnはCashSuperを拡張{ プライベートmoneyCondition:番号 = 0 。 プライベートmoneyReturn:数 = 0 ; パブリックコンストラクタ(moneyCondition:数、moneyReturn:数){ スーパー()。 この .moneyCondition = moneyCondition。 この .moneyReturn = moneyReturn。 } 公共acceptCash(お金:数):数{ 場合(お金> = この.moneyCondition) お金 =お金- この .moneyReturn * Math.floor(お金/ 本.moneyCondition)。 返すお金を。 } }
CashContextポリシーコンテキストインタフェース
クラスCashContext { 公共CS:CashSuper = ヌル パブリックコンストラクタ(型:String){ スイッチ(タイプ){ 場合 "ノーマル" : せCN:CashNormal = 新しいCashNormal()。 この .csファイルの=のCN; 破ります; ケース "リベート" : 聞かせてCB:CashRebate = 新しい CashRebate(0.8 ); このは.cs = CB。 破ります; ケース「戻ります」: CTてみましょう:CashReturn = 新しい CashReturn(300、100 ); このは.cs = CT; 破ります; } } 公共のgetResult(お金:数):数{ 戻り 、この.cs.acceptCash(お金)。 } }
PS:上記のコードポリシーモデルおよび単純な工場結合の目的は、カップリングを低減するために、クライアント・アルゴリズムは完全に分離CashContextクラスを参照する場合にのみ呼び出すことです。このプロセスは開閉の原理にある程度の反対にもあるが、さらに改善するために使用することができる反射技術を。
クライアントのテスト
総レット:番号= 1000; // 元の価格に買う のlet cc_1:CashContext = 新新 CashContext( "ノーマル"); // 元の価格 のlet cc_2:CashContext = 新新 CashContext( "戻る"); // リベート のlet cc_3:CashContext = 新新 CashContext( "リベート"); // 値引き戦略 合計 = cc_1.GetResult(合計); // 1000年 合計= cc_2.GetResult(合計); // 1000年- > 700 合計= cc_3.GetResult(合計); // 700 - > 560
長所と短所
利点:
1、
ポリシーモードは、関連する管理アルゴリズムの家族の方法を提供します
。クラス階層戦略は、アルゴリズムや行動の家族を定義します。コードの重複を避けるために適切な使用の継承コードは、共通の親クラスに転送することができます。
2は、
モードを置き換えることができますポリシーは、道の継承を提供しています
。継承は、アルゴリズムや行動の多様性を扱うことができます。、Strategyパターンを使用しない場合は、いくつかのサブカテゴリーがあるかもしれない環境の種類にアルゴリズムや振る舞いを使用し、各サブクラスは、異なるアルゴリズムまたは動作を提供します。しかし、この行為自体、または一緒に混合の方法でユーザアルゴリズムやアルゴリズムと行動。これは、アルゴリズムやロジックは、アルゴリズムやロジックの行動を取ると、それは不可能ために独立して再進化作り、一緒に混合するアクションの種類を決定します。継承は動的にアルゴリズムを変更することができますか動作が不可能になります。
3、
複数の条件分岐文の使用を避けるために、戦略パターンを使用しました
。多分岐文は、維持するすべての内部の多分岐声明に記載されているが、また道より原始的と後方に継承され、一緒に混合する行為を取るロジックおよび算術及び論理や行動アルゴリズムにそれを取ることは容易ではありません。
短所:
1、クライアントはすべてのポリシークラスを知っている必要がありますし、クラスが使用する戦略を決定します。これは、クライアントが適時に適切なアルゴリズムのクラスを選択するために、これらのアルゴリズムの違いを理解しなければならないことを意味します。言い換えれば、ポリシーはクライアントのみをモデル化するために適用されるすべてのアルゴリズムや動作状況を知っています。
2は、戦略パターン戦略クラスの多くで、その結果、各クラスには、具体的な戦略、新しいクラスを持つことになります。それは時々内部にクライアントの状態を格納することで、環境に依存し、戦略はクラスインスタンス異なるクライアントを使用することができるように、共有されるように設計された戦略ができます。言い換えれば、あなたは使用することができる
フライ級の
オブジェクトの数を減らすために。