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