デザインモード - 行動 - Strategyパターン

戦略モード(戦略):

  戦略モードアルゴリズムのパッケージである、とアルゴリズムの使用は、異なるオブジェクトの管理に委任セグメンテーションアルゴリズム自体オフの責任です。Strategyパターンは、通常、一連のアルゴリズムは、抽象的な政策サブクラスとして、クラス内の戦略のシリーズをパッケージ化します。一つの文は、それは次のようになります。「彼らは交換可能になるように、アルゴリズムのセット、各アルゴリズムを準備し、カプセル化されました。」

戦略役割モデル:  

  

  1)環境(コンテキスト)またはオブジェクト戦略への参照を維持するために、高分子方法の組み合わせを使用して。

  2)抽象戦略(戦略):サポートされるすべてのアルゴリズムのための共通インタフェースの定義。コンテキストはConcreteStrategy定義されたアルゴリズムを呼び出すためにこのインタフェースを使用します。

  3)具体的な戦略(ConcreteStrategy):戦略インタフェースを実装します。

ケース:

  ;電荷キャッシュバック(バック20に対して少なくとも300)、料金の割引(20%OFF)通常料金:充電店舗販売システムは、3つの論理を使用します。 

1  内部 クラスプログラム
 2  {
 3      プライベート 静的 ボイドメイン(文字列[]引数)
 4      {
 5          CashContext cashContext = 新しい CashContext(新しいCashNormal())。
6          Console.WriteLineを(cashContext.GetResult(200 ))。
7          CashContext cashContext2 = 新しい CashContext(新しい CashRebate(0.8 ))。
8          Console.WriteLineを(cashContext2.GetResult(200 ))。
9         CashContext cashContext3 = 新しい CashContext(新しい CashReturn(30020 ))。
10          Console.WriteLineを(cashContext3.GetResult(300 ))。
11      }
 12  }
 13  
14  ///  <要約> 
15  /// 环境类コンテキスト
 16  ///  </要約> 
17  パブリック クラスCashContext
 18  {
 19の     プライベートCashSuper CS。
20  
21      公共CashContext(CashSuper cashSuper)
 22      {
23は、         の.cs = ; cashSuper
 24      }
 25  
26である     公共の ダブルのgetResult(ダブルマネー)
 27      {
 28          IF(!CS = ヌル29          {
 30              リターンcs.AcceptCash(金)、
 31である         }
 32          リターン 0 ;
 33である     }
 34である }
 35  
36  ///  <まとめ> 
37  /// 充電システムは、戦略相当
 38が ///  </要約> 
39  公衆 インタフェースCashSuper
 40  {
 41      ダブル AcceptCash(二重お金)。
42  }
 43  
44  ///  <要約> 
45  /// 正常收费
 46  ///  </要約> 
47  パブリック クラスCashNormal:CashSuper
 48  {
 49      公共 ダブル AcceptCash(二重お金)
 50      {
 51          リターンお金。
52      }
 53  }
 54  
55  ///  <概要> 
56 /// 打折收费
 57  ///  </要約> 
58  パブリック クラスCashRebate:CashSuper
 59  {
 60      プライベート ダブル moneyRebate = 1D。
61  
62      公共 CashRebate(ダブルmoneyRebate)
 63      {
 64          この .moneyRebate = moneyRebate。
65      }
 66  
67      公共 ダブル AcceptCash(二重お金)
 68      {
 69          リターンマネー* moneyRebate。
70     }
 71  }
 72  
73  ///  <要約> 
74  /// 返现收费
 75  ///  </要約> 
76  パブリック クラスCashReturn:CashSuper
 77  {
 78      プライベート ダブル moneyCondition = 0.0d 79      プライベート ダブル moneyReturn = 0.0d 80  
81      公共 CashReturn(ダブル moneyCondition、ダブルmoneyReturn)
 82      {
 83          この .moneyCondition =moneyCondition;
84          この .moneyReturn = moneyReturn。
85      }
 86  
87      公共 ダブル AcceptCash(二重お金)
 88      {
 89          二重結果= お金。
90          であれば(お金> = moneyCondition)
 91              結果=お金- Math.Floor(お金/ moneyCondition)* moneyReturn。
92          リターン結果;
93      }
 94 }

戦略モードの長所と短所:

  利点:

    1)戦略モードでは、関連する管理アルゴリズムのアプローチのファミリーを提供しています。クラス階層戦略は、アルゴリズムや行動の家族を定義します。コードの重複を避けるために適切な使用の継承コードは、共通の親クラスに転送することができます。

    2)戦略モードでは、継承を交換する方法を提供することができます。継承は、アルゴリズムや行動の多様性を扱うことができます。、Strategyパターンを使用しない場合は、いくつかのサブカテゴリーがあるかもしれない環境の種類にアルゴリズムや振る舞いを使用し、各サブクラスは、異なるアルゴリズムまたは動作を提供します。しかし、この行為自体、または一緒に混合の方法でユーザアルゴリズムやアルゴリズムと行動。これは、アルゴリズムやロジックは、アルゴリズムやロジックの行動を取ると、それは不可能ために独立して再進化作り、一緒に混合するアクションの種類を決定します。継承は動的にアルゴリズムを変更することができますか動作が不可能になります。

    3)複数の条件分岐文の使用を避けるために、戦略パターンを使用します。多分岐文は、維持するすべての内部の多分岐声明に記載されているが、また道より原始的と後方に継承され、一緒に混合する行為を取るロジックおよび算術及び論理や行動アルゴリズムにそれを取ることは容易ではありません。

  短所:

    1)クライアントは、すべてのポリシークラスを知っている必要がありますし、クラスが使用する戦略を決定します。これは、クライアントが適時に適切なアルゴリズムのクラスを選択するために、これらのアルゴリズムの違いを理解しなければならないことを意味します。言い換えれば、ポリシーはクライアントのみをモデル化するために適用されるすべてのアルゴリズムや動作状況を知っています。

    2)戦略モードでは、各クラスには具体的な戦略新しいクラスを持つことになり、戦略クラスの多くを引き起こします。それは時々内部にクライアントの状態を格納することで、環境に依存し、戦略はクラスインスタンス異なるクライアントを使用することができるように、共有されるように設計された戦略ができます。言い換えれば、あなたは使用することができるフライ級のオブジェクトの数を減らすために。

アプリケーションシナリオの戦略モード:

  1)システムは、それぞれのアルゴリズムクラスポリシーにカプセル化することができるときに動的にいくつかのアルゴリズムを選択する必要があります。

  2)クラスは、行動複数のこのクラスの動作における条件文の複数の形でこれらの動作を定義し、各条件分岐は、条件文の代わりに、それぞれのポリシークラスに移動させることができます。

  各アルゴリズム3)完全に互いに独立して、顧客を隠す実装の詳細特定のアルゴリズム要件のシステム。

  4)システムは、その動作のデータは、戦略パターンがアルゴリズムに関連付けられたデータ構造を隠すために使用することができるかを知るべきではないアルゴリズムを使用する顧客を必要とします。

  5)複数のクラス別の動作の性能の差のみを、あなたは、Strategyパターンを使用することができ、実行時に動的に行動実行する具体的な選択。

Strategyパターンとファクトリパターンの違いは?

  構造上の観点からは、ポリシーモデルと工場パターンは、サブクラスがコンテナ(ファクトリクラスファクトリモード、コンテンツベースの戦略モード)にパラメータを渡すことにより、抽象親クラスを継承している対応する動作の動作クラスを選択します。しかし、我々はすべての戦略パターンは、行動デザインパターンである一方、工場出荷時のモデルは、デザインパターンを作成することであることを知っています。両端にそれがどのような違いを生むん?

  1)工場パターンがオブジェクトを作成するために使用され、戦略パターンは、オブジェクトの挙動の数の挙動を選択することができるようにすることです。

  2)懸念は懸念がパッケージの振る舞いで、関心のオブジェクトを作成するには、同じではありません。

  3)異なる問題を解決する:工場パターン生成に関する設計パターンであり、それはコマンドを受け入れ、要件を満たすために新しいインスタンスを作成し、オブジェクトを作成するように、それは主溶液がリソースの均一な分布であり、オブジェクトは完全に独立して作成し、具体的な使用は、クライアントに依存しません。主に、マルチデータベースの選択でファイルの読み込みライブラリなどを使用。Strategyパターンは解決することで切り替え、拡大戦略することで、彼らはお互いを置き換えることができるように戦略パターン戦略の変化が顧客の使用ポリシーとは独立であるように、カプセル化された家族政策のより簡潔な定義であることを述べました。

  4)ブラックボックス機能、ホワイトボックスに対応するポリシーに対応します。

戦略モードとブリッジモードの違いは?

  ブリッジモードでは、抽象実装者は重合の方法によって引用しました。戦略モードでは、コンテキストはまた、集約基準戦略抽象インタフェースを使用します。図両方の構造から分かるように、両方のモードで、そこに別のオブジェクトに重合抽象インタフェースを用いた場合のオブジェクト参照であり、抽象インタフェースは、種々であり得る実装と置き換えてもよいです。これは、呼び出し元であるそれらの外観、ならびに抽象の実装からインターフェイスの分離に呼び出さ両者のデカップリングといえます。しかし、両者の間にはいくつかの違いがあります。

  1)形でだけでなく、ブリッジモードの変更で)実装者(ConcreateImplementiorを有するが、抽象(RefinedAbstraction)変更することができ、変更は完全に独立しており、RefinedAbstraction ConcreateImplementior間の疎結合、それらは単に抽象によって間実装者との間のリンクとの関係。戦略モードでは、唯一のかけがえのないアルゴリズム、コンテキストの変化を考慮していません。

  2)意味的に、モデルを架橋することは実装者インターフェースは、基本的な操作を提供強調、及びこれらの基本的な運用上の定義は、操作のより高いレベルに基づく抽象します。戦略と戦術モデルが提供する抽象インタフェースは、一般的にステートレスなアルゴリズム、データなしで強調し、そしてコンテキストは単純にその動作を完了するために、これらのアルゴリズムを呼び出しています。

  クラスとオブジェクトの継承によって、重合組み合わせ:3)ブリッジモードのみ構造的特徴のパターンを反映して、存在しないだけと通信する抽象実装者インタフェースとインタフェース定義、抽象インプリインタフェースを定義しますより大きな構造を形成します。戦略モードでは、Startegy、コンテキストインタフェースは、行動のパターンであるので、他の機能インターフェースに関連していなかった、両者の界面のコラボレーションです。ここでは、多くの場合、通信相手を分離します仲介オブジェクトを導入することで、オブジェクト間の通信を扱う行動パターンの主な機能は、実際にコンテキスト実際のアルゴリズムプロバイダーのデカップリングです。

  所以相对策略模式,桥接模式要表达的内容要更多,结构也更加复杂。桥接模式表达的主要意义其实是接口隔离的原则,即把本质上并不内聚的两种体系区别开来,使得它们可以松散的组合,而策略在解耦上还仅仅是某一个算法的层次,没有到体系这一层次。从结构图中可以看到,策略的结构是包容在桥接结构中的,桥接中必然存在着策略模式,Abstraction与Implementor之间就可以认为是策略模式,但是桥接模式一般Implementor将提供一系列的成体系的操作,而且Implementor是具有状态和数据的静态结构。而且桥接模式Abstraction也可以独立变化。

参考:https://blog.csdn.net/donnie88888888/article/details/52751328

  https://blog.csdn.net/basycia/article/details/50478245

  http://www.blogjava.net/wangle/archive/2007/04/25/113545.html

おすすめ

転載: www.cnblogs.com/az4215/p/11617422.html