Strategy e Template MethodProfessor: 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...
4
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 case terá que ser adicionado!!! Alterando novamente a classe ingresso...
Solução??? Padrão Strategy
5
Encapsular algoritmos em objetos denominados estratégias!!!
6
Ingresso <<interface>>Calculavel
CalcNormal
CalcCriancaCalcIdoso
CalcVale
getPreco();
getPreco();
getPreco();
getPreco();
getPreco();
A limpeza:
É possível adicionar facilmente novas estratégias
A alteração de estratégias existentes não afeta a clase Ingresso 7
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.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
13Strategy e Template Method
RELATÓRIO TÉCNICOSóBug Softwares
Empresa de Software SóBugAv. ABC, 0100101, Campina Grande, PB
Tel.: 8888-9888
ISSO MUDA!!!Vendas
ComprasFornecedores
LucrosDespesas...
FIXO
FIXO
MUTÁVEL
Como projetar???
14Strategy e Template Method
<<interface>>RelatórioIF
RelatorioVendas
RelatorioCompras
RelatorioLucros
Testeexibir();
exibir();
exibir();
exibir();
Problemas??? O cabeçalho e rodapé são iguais... não estou
compartilhando código...e ainda estou duplicando
15Strategy e Template Method
<<interface>>RelatórioIF
RelatorioVendas
RelatorioCompras
RelatorioLucros
Testeexibir();
exibir();
exibir();
exibir();
Códigoduplicado
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...
16Strategy e Template Method
public void exibir(){ exibirCabecalho(); exibirConteudo(); exibirRodape();}
17Strategy e Template Method
public void exibirCabecalho(){System.out.println(“Cabecalho”);System.out.println(“...”);...
}
public void exibirRodape(){System.out.println(“Rodapé”);System.out.println(“...”);...
}
public void abstract exibirConteudo();
Template Method
Projeto com o Template Method (exibir())
18Strategy e Template Method
<<abstract>>RelatorioAbstrato
RelatorioVendas
RelatorioCompras
RelatorioLucros
Testeexibir();
exibirConteudo();
exibirConteudo();
exibirConteudo();
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 20
Strategy e Template Method
O que vimos hoje?
Strategy
Template Method
21Strategy e Template Method
O que veremos na próxima aula?
Visão crítica sobre padrões: over-engineering
22Strategy e Template Method
Dúvidas?
?23Strategy e Template Method