Padrões de ProjetoAula 5 – Padrão Decorator
Padr
ões d
e Pr
ojet
o - D
ecor
ator
• QuickReview: Observer• Definição:
• Quando usar?
• Tipo de padrão?
• Como?
Padr
ões d
e Pr
ojet
o - D
ecor
ator
PADRÃO DECORATOR
Anexa responsabilidades adicionaisa um objeto de maneira dinâmica.
Padr
ões d
e Pr
ojet
o - D
ecor
ator
Starbuzz Coffee [1]• Cenário• Starbuzz Coffee ficou conhecido como o café com o crescimento
mais rápido da região. Se você já viu um na sua esquina, olhe para o outro lado da rua: você verá outro.
• Como eles cresceram muito rápido, estão tendo dificuldades em atualizar seus sistemas de pedidos para corresponder a suas ofertas de bebidas.
Padr
ões d
e Pr
ojet
o - D
ecor
ator
• Quando eles entraram no negócio, projetaram suas classes assim:
calcularPreco() é abstrato, para que as subclasses defi-nam sua implementação.
Padr
ões d
e Pr
ojet
o - D
ecor
ator
• Além do seu café, você pode pedir vários adicionais. Dê uma olhadinha no cardápio.
Os adicionais são o atrativo desse lugar!
• Cada adicional tem um preço, e portanto devemos incluí-los no sistema.
Padr
ões d
e Pr
ojet
o - D
ecor
ator
Temos o café e os adicionais... Como o café deve ser montado dinamicamente? Como esse preço
deve ser calculado dinamicamente?
Padr
ões d
e Pr
ojet
o - D
ecor
ator
• Tradicional + Leite; Tradicional + Espuma; Tradicional + Leite + Espuma, ...
Solução I: uma classe para cada combinação
Cada classe calcula o preço do café com o seu adicional.
Isso nos daria uma combinação de quantas classes?E quando o leite aumentar?E quando um novo adicional entrar?
CANCELADA!
• Leite, espuma, creme, chocolate
Solução II: variáveis para representar os adicionais
Calcula o custo total dos adicionais.
Retorna o preço de cada bebida + adicionais.
E se o preço dos adicionais mudarem?E se surgirem novos condimentos?E se chá gelado entrar no cardápio?E se um cliente quiser 2x creme?
Padr
ões d
e Pr
ojet
o - D
ecor
ator
Padr
ões d
e Pr
ojet
o - D
ecor
ator
O princípio Aberto-Fechado
• Herança nem sempre leva a designs flexíveis e fáceis de manter. • Um meio mais interessante de “herdar” comportamento é via
composição. (Um dos princípios é: prefira composição à herança)• Compondo objetos de formas dinâmicas é possível adicionar
novas funcionalidades através da criação de um código novo, ao invés de alterar o já existente.
As classes devem estar abertas para extensão mas fechadas para modificação.
Ok... Então, qual é a melhor
solução para StarBuzz?12
Solução 3 (a melhor entre elas):
PADRÃO DECORATOR!Considera os princípio de herança/composição e aberto/fechado.
13
Padr
ões d
e Pr
ojet
o - D
ecor
ator
• O cliente primeiro escolhe o tipo de bebida, e depois escolhe os adicionais em tempo de execução.
Solução III: padrão Decorator
Senhor, pode me falar o seu pedido...
Desejo um café tradicional...
Com quais adicionais, senhor?
Com chocolate...
Mais algum adicional, senhor?
E com leite!
Ok, senhor! Só um minutinho, já digo quanto custa. ;-)
Padr
ões d
e Pr
ojet
o - D
ecor
ator
Solução III: padrão Decorator
Vamos lá:1. Café tradicional: R$1.502. Adicional de chocolate: R$1.003. Adicional de leite: R$0.50
Custa 3 reais, senhor!
Padr
ões d
e Pr
ojet
o - D
ecor
ator
• Em termos de implementação, como é possível decorar os objetos?
1. Começamos com o objeto Cafe-Tradicional.
2. Criamos um objeto Chocolate e englobamos CafeTradicional nele.
3. Criamos um decorador Leite e colocamos Chocolate dentro.
calcularPreco()Leite
calcularPreco()CafeTradicional
calcularPreco()Chocolate
calcularPreco()CafeTradicional
calcularPreco()CafeTradicional
calcularPreco()Chocolate
Padr
ões d
e Pr
ojet
o - D
ecor
ator
• E como é calculado o preço desse café e seus adicionais?
calcularPreco()Leite
calcularPreco()CafeTradicional
calcularPreco()Chocolate
1. Chamamos calcularPreco() do decorador externo, Leite.
2. Leite chama calcularPreco() de Chocolate.
3. Chocolate chama calcular-Preco() de CafeTradicional.
4. CafeTradicional re-torna seu valor.
5. Chocolate retorna seu valor + CafeTradicional
6. Leite retorna seu valor + Chocolate, que é o valor total.
Padr
ões d
e Pr
ojet
o - D
ecor
ator
Terminologia e estruturatambém pode ser classe abstrata, dependendo do contexto
Padr
ões d
e Pr
ojet
o - D
ecor
ator
Componentes aos quais adicionamos dinamicamente um novo comportamento.
Os decoradores precisam da mesma interface dos componentes, porque ficam no lugar deles.
Os decoradores englobam um componente.
Bebida, a nossa superclasse.
20Onde calculamos o preço de um CafeTradicional.
21
Onde calculamos o preço do Chocolate + CafeTradicional.
Bebida que estamos englobando.
Os decoradores precisam ser do mesmo tipo que as bebidas.
22
Pedido: Um café tradicional,com chocolate,com leite.
Resultado...
• Categoria: padrão do tipo estrutural• O padrão funciona como um wrapper para classes
existentes• Este padrão cria uma classe decoradora que
empacota a classe original para prover novas funcionalidades. Tudo isto é feito sem que haja alteração na estrutura da classe.
• Ao contrário da herança, que aplica funcionalidade a todos os objetos dela, ele permite adicionar funcionalidades a um objeto específico sem alterar a estrutura da classe.
23
• Os decoradores têm o mesmo supertipo que os objetos que eles decoram;• É permitido usar 1/+ decoradores para
englobar um objeto;• Os objetos podem ser decorados
dinamicamente em tempo de execução.
24
Padr
ões d
e Pr
ojet
o - D
ecor
ator
Referências• [1] O caso Starbuzz é abordado no capítulo 3 do livro “Padrões
de Projeto – Use a Cabeça!”• Padrão de Projeto Decorator. Slides de Juliane Silva. Online
em: http://pt.slideshare.net/jlsansil/padro-de-projeto-decorator