Modo estrategia
origen
El modo ESTRATEGIA de Delphi se amplía sobre la base de ESTRATEGIA. Para obtener más información sobre el modo ESTRATEGIA, consulte "Patrón de diseño, página 208".
Objetivo
Defina una serie de algoritmos, encapsúlelos uno por uno y hágalos intercambiables. Este patrón hace que el algoritmo sea independiente de los cambios en el cliente que lo utiliza.
motivación
? Se pueden transformar dinámicamente diferentes estrategias según sea necesario. ¿Encapsular mejor múltiples comportamientos y estructuras de algoritmos sin permitir que los programas cliente interfieran directamente? Seleccionar el método de comportamiento correcto a través de declaraciones condicionales relevantes. El método
Plantilla utiliza la herencia para transformar partes del algoritmo. Las estrategias utilizan proxies y combinaciones para transformar todos los algoritmos y admitir transformaciones dinámicas. En el futuro, el objeto de contexto se utilizará para asignar dinámicamente algoritmos específicos en tiempo de ejecución. De manera similar, al utilizar el objeto de contexto, la clase de cliente se separará de la interfaz del algoritmo dependiente y se pueden proporcionar interfaces más generalizadas a través del objeto de contexto. En el mismo sentido, a través de
las interfaces de contexto y
estrategia , se pueden diseñar y proporcionar en el futuro algoritmos relacionados con todo el sistema para implementar aplicaciones específicas sin cambiar las interfaces.
Las estrategias también le permiten crear un marco de clases único, simple y mantenible. Los marcos de clases se basan en la herencia.
solicitud
Implementación
El siguiente ejemplo calcula la tasa de interés mensual de una tarjeta de crédito.
El modo de estrategia encapsula y accede a interfaces a través de la clase abstracta única TfinanzeCharge y proporciona diferentes algoritmos para calcular las tasas de interés mensuales. TregularCharge y TPReferredCharge encapsulan diferentes algoritmos específicos para el cálculo de la tasa de interés mensual de tarjetas de crédito. TmonthlyCharge implementa la interfaz TcontextCharge y configura diferentes objetos de política. TconntextCharge se convierte en el motor intermedio de los objetos del cliente y los objetos de estrategia, lo que ayuda a reducir la dependencia de los objetos del cliente y las estrategias/objetos.
// Interfaz de estrategia ( clase abstracta) TFinanzeCharge = class public // Devuelve el resultado calculado
función getCharge(const Balance: double): double // Estrategia específica TRegularCharge = class(TFinanzeCharge) public
function getCharge(const; Saldo: doble): doble; anular ; fin;
// Estrategia específica TPreferredCharge = clase (TFinanzeCharge)
función pública getCharge (const Saldo: doble): doble; end;El programa cliente se basa en la interfaz de contexto para programar la estrategia especificada. Sin embargo, dado que la interfaz de contexto se genera para el programa cliente, el programa cliente debe conocer las políticas/objetos disponibles. Si el contexto no puede devolver una instancia válida, opcionalmente puede elegir una implementación de método con una estrategia predeterminada.
// Interfaz de contexto TChargeContext = clase public
function ComputeCharges(const Balance: double): double: double virtual ; // La clase de contexto específica TmonthlyCharges sirve como motor intermedio para el objeto cliente y el objeto de estrategia, y se
pasa ; su constructor Se configura una instancia de cálculo de tasa de interés específica.
Esta clase actúa como mediadora entre el cliente y las clases de estrategia, y se configura mediante composición y pasando una instancia de un cargo financiero concreto en su constructor.
TMonthlyCharges = class(TChargeContext) private FFinanzeCharge; public//
Función de interfaz a la que accede el programa cliente ComputeCharges(const Balance: double): double // constructor configura el constructor del objeto de contexto Create(aFinanzeCharge: TFinanzeCharge); Destruir; anular; finalizar;---implementación
// función TRegularCharge TRegularCharge.getCharge(const Saldo: doble): doble;comenzar resultado := Saldo * (REG_RATE / 12);end;
// Función TPreferredCharge TPreferredCharge.getCharge(const Saldo: doble): doble;comenzar // esto podría ser un complejo algoritmo que tiene en cuenta // los patrones de compra del titular de la tarjeta de crédito y los puntos de recompensa acumulados: = Saldo * (PREFERRED_RATE / 12); fin
// Concreto; Contexto // constructor de TMonthlyCharges TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);begin heredado Create; // aFinanzeCharge configura el objeto de contexto // esta clase toma posesión de aFinanzeCharge (lo destruirá) FFinanzeCharge := aFinanzeCharge;end;destructor TMonthlyCharges.Destroy; comenzar FFinanzeCharge.Free heredado; Destruir; finalizar; función TMonthlyCharges.ComputeCharges (saldo constante: doble): doble; comenzar resultado: = FFinanzeCharge.getCharge (saldo); finalizar;
Ejemplo de Delfos