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 se o cliente tem carteira de estudante promoções-relâmpago ... 2 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? 3 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 } 4 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 case terá que ser adicionado!!! Alterando novamente a classe ingresso... Solução??? Padrão Strategy 5 Encapsular algoritmos em objetos denominados estratégias!!! Ingresso <<interface>> Calculavel getPreco(); CalcVale CalcNormal getPreco(); CalcCrianca getPreco(); CalcIdoso getPreco(); getPreco(); 6 A limpeza: public double getPreço(){ return this.calculador.getPreco(); } É possível adicionar facilmente novas estratégias A alteração de estratégias existentes não afeta a clase Ingresso 7 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. 8 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 9 Outro exemplo: LayoutManager 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... 12 Strategy e Template Method Template Method FIXO RELATÓRIO TÉCNICO SóBug Softwares ISSO MUDA!!! Vendas Compras Fornecedores Lucros Despesas... FIXO Strategy e Template Method MUTÁVEL Empresa de Software SóBug Av. ABC, 0100101, Campina Grande, PB Tel.: 8888-9888 13 Como projetar??? Teste exibir(); <<interface>> RelatórioIF RelatorioVendas RelatorioLucros exibir(); exibir(); RelatorioCompras exibir(); Strategy e Template Method 14 Problemas??? O cabeçalho e rodapé são iguais... não estou compartilhando código...e ainda estou duplicando Teste exibir(); <<interface>> RelatórioIF RelatorioVendas RelatorioLucros exibir(); exibir(); RelatorioCompras Código duplicado Strategy e Template Method exibir(); 15 Template Method Solução??? Template Method Define-se um esqueleto do método exibir... public void exibir(){ exibirCabecalho(); exibirConteudo(); exibirRodape(); } E define o comportamento MUTÁVEL como um método abstrato... Strategy e Template Method 16 public void exibirCabecalho(){ System.out.println(“Cabecalho”); System.out.println(“...”); ... } public void exibirRodape(){ System.out.println(“Rodapé”); System.out.println(“...”); ... } public void abstract exibirConteudo(); Strategy e Template Method 17 Template Method Projeto com o Template Method (exibir()) Teste exibir(); <<abstract>> RelatorioAbstrato RelatorioVendas RelatorioLucros exibirConteudo(); exibirConteudo(); RelatorioCompras exibirConteudo(); Strategy e Template Method 18 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”. 19 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 20 O que vimos hoje? Strategy Template Method Strategy e Template Method 21 O que veremos na próxima aula? Visão crítica sobre padrões: over-engineering Strategy e Template Method 22 Dúvidas? ? Strategy e Template Method 23