230 likes | 367 Views
Strategy e Template Method. Professor: Hyggo Almeida. Sistema de venda de ingressos Existe uma classe Ingresso que possui um método getPreco () ; O preço muda de acordo com a idade da pessoa... e outras coisas mais... quando o ingresso foi comprado
E N D
Strategy e TemplateMethod Professor: Hyggo Almeida
Sistema de venda de ingressos • Existe uma classe Ingresso que possui um método getPreco(); • O preço muda de acordo com a idade da pessoa... e outras coisas mais... • quando o ingresso foi comprado • se o cliente tem carteira de estudante • promoções-relâmpago • ...
Possíveis soluções • Colocar a lógica que decide qual cálculo deve ser feito na classe Ingresso • Hierarquia de classes para Ingresso • Que mais?
Strategy • E define o algoritmo para retornar o preço de acordo com o tipo do ingresso... public double getPreço(){ switch(tipoIngresso){ case 0: return 3.00 + TAXA_ADICIONAL; case 1: return 2.00 + TAXA_DESCONTO; case 2: return 4.00 + TAXA_ADICIONAL; case 3: return 1.00; } return 5.00; //Preço normal }
Strategy • Problemas??? • Sempre que um cálculo de preço for alterado... a classe ingresso terá que ser alterada. • Se uma nova promoção surgir... um novo caseterá que ser adicionado!!! Alterando novamente a classe ingresso... • Solução??? • Padrão Strategy
Encapsular algoritmos em objetosdenominados estratégias!!! Ingresso <<interface>> Calculavel getPreco(); CalcVale CalcNormal getPreco(); getPreco(); CalcIdoso CalcCrianca getPreco(); getPreco();
A limpeza: • É possível adicionar facilmente novas estratégias • A alteração de estratégias existentes não afeta a claseIngresso public double getPreço(){ return this.calculador.getPreco(); }
Strategy • Intenção • definir uma família de algoritmos, encapsular cada uma delas e torná-las intercambiáveis. Permite que o algoritmo varie independente dos clientes que o utilizam. • Aplicabilidade • muitas classes relacionadas diferem apenas no seu comportamento; • você necessita de variantes de um determinado algoritmo.
Strategy • Conseqüências • famílias de algoritmos relacionados • uma alternativa ao uso de subclasses • estratégias eliminam comandos condicionais da linguagem de programação • possibilita escolher dinamicamente uma implementação • os clientes precisam conhecer várias estratégias • aumento do número de objetos
Exemplo com Ingresso • Repare que a estratégia precisa de informação do contexto • E se a estratégia fosse escolher a melhor forma de cálculo dentre várias disponíveis?
Template Method • Imaginem o projeto de um gerador de relatório... • Exemplo muito simples... porém eficaz! • Uma classe Relatório possui um método exibir() • Este método exibe o relatório na tela • O texto do relatório depende do seu tipo • Mas o cabeçalho e o rodapé são sempre os mesmos... Strategy e Template Method
Template Method RELATÓRIO TÉCNICO SóBug Softwares FIXO ISSO MUDA!!!Vendas Compras Fornecedores Lucros Despesas... MUTÁVEL Empresa de Software SóBug Av. ABC, 0100101, Campina Grande, PB Tel.: 8888-9888 FIXO Strategy e Template Method
Como projetar??? exibir(); <<interface>> RelatórioIF Teste RelatorioVendas RelatorioLucros exibir(); exibir(); RelatorioCompras exibir(); Strategy e Template Method
Código duplicado • Problemas??? • O cabeçalho e rodapé são iguais... não estou compartilhando código...e ainda estou duplicando exibir(); <<interface>> RelatórioIF Teste RelatorioVendas RelatorioLucros exibir(); exibir(); RelatorioCompras exibir(); Strategy e Template Method
Template Method • Solução??? • Template Method • Define-se um esqueleto do método exibir... • E define o comportamento MUTÁVEL como um método abstrato... publicvoid exibir(){ exibirCabecalho(); exibirConteudo(); exibirRodape(); } Strategy e Template Method
publicvoid exibirCabecalho(){ System.out.println(“Cabecalho”); System.out.println(“...”); ... } publicvoid exibirRodape(){ System.out.println(“Rodapé”); System.out.println(“...”); ... } publicvoidabstract exibirConteudo(); Strategy e Template Method
Template Method • Projeto com o Template Method (exibir()) exibir(); <<abstract>> RelatorioAbstrato Teste RelatorioVendas RelatorioLucros exibirConteudo(); exibirConteudo(); RelatorioCompras exibirConteudo(); Strategy e Template Method
Template Method • Intenção • Definir o esqueleto de um algoritmo em uma operação, postergando alguns passos para as subclasses • Aplicabilidade • para implementar as partes invariantes de um algoritmo uma só vez e deixar para as subclasses a implementação do comportamento que pode variar • para controlar extensões de subclasses utilizando “ganchos”. Strategy e Template Method
Template Method • Conseqüências • maximiza a reutilização de código • definição de “ganchos” para as subclasses • princípio de Hollywood: “não nos chame... nós chamamos vocês” • Alternativa ao Strategy • Uso freqüente... • Application Frameworks Strategy e Template Method
O que vimos hoje? • Strategy • Template Method Strategy e Template Method
O que veremos na próxima aula? • Visão crítica sobre padrões: over-engineering Strategy e Template Method
Dúvidas? ? Strategy e Template Method