ストラテジーモード
起源
Delphi の STRATEGY モードは、STRATEGY をベースに拡張されています。 STRATEGY モードの詳細については、「デザインパターン 208 ページ」を参照してください。
目的
一連のアルゴリズムを定義し、それらを 1 つずつカプセル化し、交換可能にします。このパターンにより、アルゴリズムは、それを使用するクライアントの変更から独立します。
モチベーション
? 必要に応じて、さまざまな戦略を動的に変換できます。 ? クライアント プログラムに直接干渉させずに、複数の動作とアルゴリズム構造をカプセル化する方が適切ですか? 関連する条件ステートメントを通じて正しい動作方法を選択します。
Templateメソッドは継承を使用してアルゴリズムの一部を変換します。ストラテジーでは、プロキシと組み合わせを使用してすべてのアルゴリズムを変換し、動的な変換をサポートします。将来的には、コンテキスト オブジェクトは実行時に特定のアルゴリズムを動的に割り当てるために使用される予定です。同様に、コンテキスト オブジェクトを使用すると、クライアント クラスが依存するアルゴリズム インターフェイスから分離され、コンテキスト オブジェクトを通じてより一般化されたインターフェイスを提供できます。同じ意味で、
コンテキストおよび
戦略インターフェイスを通じて、システム全体の関連アルゴリズムを設計および提供し、将来的にはインターフェイスを変更せずに特定のアプリケーションを実装することができます。
ストラテジーを使用すると、単一のシンプルで保守可能なクラス フレームワークを作成することもできます。クラス フレームワークは継承に依存します。
応用
実装
次の例では、クレジット カードの月利を計算します。
ストラテジーモードは、独自の抽象クラス TfinanzeCharge を介してインターフェイスをカプセル化し、アクセスし、月利を計算するためのさまざまなアルゴリズムを提供します。 TregulatoryCharge と TPReferredCharge は、クレジット カードの月利計算用のさまざまな特定のアルゴリズムをカプセル化します。TmonthlyCharge は、TcontextCharge インターフェイスを実装し、さまざまなポリシー オブジェクトを構成します。 TconntextCharge は、クライアント オブジェクトとストラテジ オブジェクトのミッドフィールド エンジンとなり、クライアント オブジェクトとストラテジ/オブジェクトの依存性を軽減するのに役立ちます。
//ストラテジ インターフェイス ( abstract class) TFinanzeCharge = class public // 計算結果を返す
関数 getCharge(const Balance: double): //特定のストラテジTRegularCharge = class(TFinanzeCharge) public
function getCharge; Balance: double): double ; //特定の戦略TPreferredCharge = class(TFinanzeCharge) public
function getCharge(const Balance: double): double; end;クライアント プログラムは、コンテキスト インターフェイスに依存して、指定された戦略をスケジュールします。ただし、コンテキスト インターフェイスはクライアント プログラム用に生成されるため、クライアント プログラムは利用可能なポリシー/オブジェクトを知っている必要があります。コンテキストが有効なインスタンスを返せない場合は、オプションでデフォルトの戦略を使用したメソッド実装を選択できます。
//コンテキスト インターフェイスTChargeContext = class public
function ComputeCharges(const Balance: double): double ;
//特定
のコンテキストクラス TmonthlyCharges がクライアント オブジェクトと
ストラテジオブジェクトのミッドフィールド エンジンとして機能し、渡されます。そのコンストラクター 特定の金利計算インスタンスがセットアップされます。
このクラスは、クライアントと戦略クラスの間の仲介者として機能し、コンポジションを使用し、コンストラクターで具体的な財務費用のインスタンスを渡すことによって構成されます。
TMonthlyCharges = class(TChargeContext) private FFinanzeCharge: TFinanzeCharge; public//
クライアント プログラムによってアクセスされるインターフェイス関数 ComputeCharges(const Balance: double): double; // コンストラクターはコンテキスト オブジェクトコンストラクターを構成します。破棄; オーバーライド;---実装
// T RegularCharge関数TRegularCharge.getCharge(const Balance: double): double;begin result := Balance * (REG_RATE / 12);end;
// TPreferredCharge関数 TPreferredCharge.getCharge(const Balance: double): double;begin // これは複雑である可能性があります// クレジット カード所有者の購入パターンと蓄積された特典ポイントを考慮したアルゴリズム result := Balance * (PREFERRED_RATE / 12);
// Concrete ;
Context // TMonthlyChargesコンストラクター TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);begin継承 Create; // aFinanzeCharge はコンテキスト オブジェクトを構成します // このクラスは aFinanzeCharge の所有権を取得します (破棄されます) FFinanzeCharge := aFinanzeCharge;end;destructor TMonthlyCharges.Destroy; FFinanzeCharge.Free を継承します。 Destroy;end;function TMonthlyCharges.ComputeCharges(const Balance: double): double;begin result := FFinanzeCharge.getCharge(Balance);end;
デルフィの例