Modo estratégia
origem
O modo ESTRATÉGIA do Delphi é expandido com base na ESTRATÉGIA. Para obter mais informações sobre o modo ESTRATÉGIA, consulte "Design Pattern Página 208"
Propósito
Defina uma série de algoritmos, encapsule-os um por um e torne-os intercambiáveis. Esse padrão torna o algoritmo independente de mudanças no cliente que o utiliza.
motivação
? Diferentes estratégias podem ser transformadas dinamicamente conforme necessário. ? Encapsular melhor vários comportamentos e estruturas de algoritmos sem permitir que os programas clientes interfiram diretamente? Selecionar o método de comportamento correto por meio de instruções condicionais relevantes. O método
Template usa herança para transformar partes do algoritmo. As estratégias usam proxies e combinações para transformar todos os algoritmos e apoiar transformações dinâmicas. No futuro, o objeto de contexto será usado para alocar dinamicamente algoritmos específicos em tempo de execução. Da mesma forma, ao usar o objeto de contexto, a classe cliente será separada da interface do algoritmo dependente e interfaces mais generalizadas podem ser fornecidas por meio do objeto de contexto. No mesmo sentido, através
das interfaces de contexto e
estratégia , algoritmos relacionados a todo o sistema podem ser projetados e fornecidos no futuro para implementar aplicações específicas sem alterar as interfaces.
As estratégias também permitem criar uma estrutura de classe única, simples e de fácil manutenção. Estruturas de classes dependem de herança.
aplicativo
Implementação
O exemplo a seguir calcula a taxa de juros mensal de um cartão de crédito.
O modo de estratégia encapsula e acessa interfaces por meio da classe abstrata exclusiva TfinanzeCharge e fornece diferentes algoritmos para calcular taxas de juros mensais. TregularCharge e TPReferredCharge encapsulam diferentes algoritmos específicos para o cálculo mensal da taxa de juros de cartões de crédito. TmonthlyCharge implementa a interface TcontextCharge e configura diferentes objetos de política. TconntextCharge se torna o mecanismo intermediário de objetos clientes e objetos estratégicos, o que ajuda a reduzir a dependência de objetos clientes e estratégias/objetos.
// Interface de estratégia ( classe abstrata) TFinanzeCharge = class public //Retorna o resultado calculado
function getCharge(const Balance: double): // Estratégia específica TRegularCharge = class(TFinanzeCharge) public
function getCharge(const virtual; Saldo: double): double; override ; // Estratégia específica TPreferredCharge = class(TFinanzeCharge) public
function getCharge(const Balance: double): double; end;O programa cliente depende da interface de contexto para agendar a estratégia especificada. Entretanto, como a interface de contexto é gerada para o programa cliente, o programa cliente deve conhecer as políticas/objetos disponíveis. Se o contexto não puder retornar uma instância válida, você poderá escolher opcionalmente uma implementação de método com uma estratégia padrão.
// Interface de contexto TChargeContext
= class public function ComputeCharges
( const Balance: double): double // A classe de contexto específica TmonthlyCharges serve como mecanismo de meio-campo para o objeto cliente e o objeto de estratégia, e é passada em; seu construtor Uma instância específica de cálculo de taxa de juros é configurada.
Esta classe atua como mediadora entre o cliente e as classes de estratégia, e é configurada usando composição e passando uma instância de um encargo financeiro concreto em seu construtor.
TMonthlyCharges = class(TCargeContext) private FFinanzeCharge: TFinanzeCharge; public//Função de interface acessada
pelo programa cliente ComputeCharges(const Balance: double): double): double construtor ; Destruir; substituir; fim;---implementação
// função TRegularCharge TRegularCharge.getCharge(const Balance: double): double;begin result := Balance * (REG_RATE / 12);end;
// função TPreferredCharge TPreferredCharge.getCharge(const Balance: double): double;begin // isso pode ser um complexo algoritmo que leva em consideração os // padrões de compra do titular do cartão de crédito e o resultado dos pontos
de recompensa acumulados := Saldo * (PREFERRED_RATE / 12);end;
Context // Construtor TMonthlyCharges TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);begin herdado Create; // aFinanzeCharge configura o objeto de contexto // esta classe toma posse de aFinanzeCharge (irá destruí-lo) FFinanzeCharge := aFinanzeCharge;end;destructor TMonthlyCharges.Destroy; comece FFinanzeCharge.Free herdado; Destruir;fim;função TMonthlyCharges.ComputeCharges(const Balance: double): double;begin result := FFinanzeCharge.getCharge(Balance);end;
Exemplo Delphi