Strategiemodus
Herkunft
Der STRATEGY-Modus von Delphi wird auf Basis von STRATEGY erweitert. Weitere Informationen zum STRATEGY-Modus finden Sie unter „Design Pattern Seite 208“.
Zweck
Definieren Sie eine Reihe von Algorithmen, kapseln Sie sie einzeln und machen Sie sie austauschbar. Dieses Muster macht den Algorithmus unabhängig von Änderungen auf dem Client, der ihn verwendet.
Motivation
? Unterschiedliche Strategien können je nach Bedarf dynamisch transformiert werden. ? Mehrere Verhaltensweisen und Algorithmusstrukturen besser kapseln, ohne dass Client-Programme direkt eingreifen können? Die
Template -Methode nutzt Vererbung, um Teile des Algorithmus zu transformieren. Strategien nutzen Proxys und Kombinationen, um alle Algorithmen zu transformieren und dynamische Transformationen zu unterstützen. Zukünftig wird das Kontextobjekt verwendet, um bestimmte Algorithmen zur Laufzeit dynamisch zuzuweisen. In ähnlicher Weise wird durch die Verwendung des Kontextobjekts die Client-Klasse von der abhängigen Algorithmusschnittstelle getrennt, und über das Kontextobjekt können allgemeinere Schnittstellen bereitgestellt werden. Im gleichen Sinne können über
die Kontext- und
Strategieschnittstellen künftig systemweite verwandte Algorithmen entworfen und bereitgestellt werden, um spezifische Anwendungen zu implementieren, ohne die Schnittstellen zu ändern.
Mit Strategien können Sie außerdem ein einzelnes, einfaches und wartbares Klassengerüst erstellen. Klassenframeworks basieren auf Vererbung.
Anwendung
Durchführung
Das folgende Beispiel berechnet den monatlichen Zinssatz für eine Kreditkarte.
Der Strategiemodus kapselt und greift auf Schnittstellen über die einzigartige abstrakte Klasse TfinanzeCharge zu und bietet verschiedene Algorithmen zur Berechnung monatlicher Zinssätze. TregularCharge und TPReferredCharge kapseln verschiedene spezifische Algorithmen für die monatliche Zinssatzberechnung von Kreditkarten. TmonthlyCharge implementiert die TcontextCharge-Schnittstelle und konfiguriert verschiedene Richtlinienobjekte. TconntextCharge wird zur Mittelfeld-Engine von Client-Objekten und Strategieobjekten, was dazu beiträgt, die Abhängigkeit von Client-Objekten und Strategien/Objekten zu verringern.
// Strategieschnittstelle ( abstrakte Klasse) TFinanzeCharge = class public //Das berechnete Ergebnis zurückgeben
function getCharge(const Balance: double): double // Spezifische Strategie TRegularCharge = class(TFinanzeCharge) public
function getCharge(const Balance: double): double; override ; // Spezifische Strategie TPreferredCharge = class(TFinanzeCharge) public
function getCharge(const Balance: double; end;Das Clientprogramm verlässt sich auf die Kontextschnittstelle, um die angegebene Strategie zu planen. Da die Kontextschnittstelle jedoch für das Client-Programm generiert wird, muss das Client-Programm die verfügbaren Richtlinien/Objekte kennen. Wenn der Kontext keine gültige Instanz zurückgeben kann, können Sie optional eine Methodenimplementierung mit einer Standardstrategie auswählen.
// Kontextschnittstelle TChargeContext = class public
function ComputeCharges(const Balance: double): double virtual; // Die spezifische Kontextklasse TmonthlyCharges dient als Mittelfeld-Engine und wird
übergeben sein Konstruktor Eine spezifische Zinsberechnungsinstanz wird eingerichtet.
Diese Klasse fungiert als Vermittler zwischen dem Client und den Strategieklassen und wird durch die Verwendung von Komposition und die Übergabe einer Instanz einer konkreten Finanzgebühr in ihrem Konstruktor konfiguriert.
TMonthlyCharges = class(TChargeContext) private FFinanzeCharge; public//
Schnittstellenfunktion, auf die vom Clientprogramm zugegriffen wird ComputeCharges(const Balance: double): double; // Konstruktor konfiguriert den Kontextobjektkonstruktor Create(aFinanzeCharge); Destroy; override; end;---implementation
// TRegularCharge -Funktion TRegularCharge.getCharge(const Balance: double): double;begin result := Balance * (REG_RATE / 12);end;
// TPreferredCharge function TPreferredCharge.getCharge(const Balance: double): double;begin // Dies könnte ein Komplex sein Algorithmus, der das Kaufverhalten des Kreditkarteninhabers und die gesammelten Prämienpunkte berücksichtigt. Ergebnis := Balance * (PREFERRED_RATE / 12);end
; Kontext // TMonthlyCharges -Konstruktor TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);begin inherited Create; // aFinanzeCharge konfiguriert das Kontextobjekt // diese Klasse übernimmt den Besitz von aFinanzeCharge (wird es zerstören) FFinanzeCharge := aFinanzeCharge;end;destructor TMonthlyCharges.Destroy; begin FFinanzeCharge.Free; geerbt Destroy;end;function TMonthlyCharges.ComputeCharges(const Balance: double): double;begin result := FFinanzeCharge.getCharge(Balance);end;
Delphi- Beispiel