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
Download

15.StrategyTemplate