1 / 23

Strategy e Template Method

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

cybil
Download Presentation

Strategy e Template Method

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Strategy e TemplateMethod Professor: Hyggo Almeida

  2. 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 • ...

  3. 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?

  4. 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 }

  5. 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

  6. Encapsular algoritmos em objetosdenominados estratégias!!! Ingresso <<interface>> Calculavel getPreco(); CalcVale CalcNormal getPreco(); getPreco(); CalcIdoso CalcCrianca getPreco(); getPreco();

  7. 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(); }

  8. 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.

  9. 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

  10. Outro exemplo: LayoutManager

  11. 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?

  12. 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

  13. 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

  14. Como projetar??? exibir(); <<interface>> RelatórioIF Teste RelatorioVendas RelatorioLucros exibir(); exibir(); RelatorioCompras exibir(); Strategy e Template Method

  15. 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

  16. 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

  17. publicvoid exibirCabecalho(){ System.out.println(“Cabecalho”); System.out.println(“...”); ... } publicvoid exibirRodape(){ System.out.println(“Rodapé”); System.out.println(“...”); ... } publicvoidabstract exibirConteudo(); Strategy e Template Method

  18. Template Method • Projeto com o Template Method (exibir()) exibir(); <<abstract>> RelatorioAbstrato Teste RelatorioVendas RelatorioLucros exibirConteudo(); exibirConteudo(); RelatorioCompras exibirConteudo(); Strategy e Template Method

  19. 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

  20. 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

  21. O que vimos hoje? • Strategy • Template Method Strategy e Template Method

  22. O que veremos na próxima aula? • Visão crítica sobre padrões: over-engineering Strategy e Template Method

  23. Dúvidas? ? Strategy e Template Method

More Related