25
Padrões de Projeto Aula 5 – Padrão Decorator

Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Embed Size (px)

Citation preview

Page 1: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Padrões de ProjetoAula 5 – Padrão Decorator

Page 2: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Padr

ões d

e Pr

ojet

o - D

ecor

ator

• QuickReview: Observer• Definição:

• Quando usar?

• Tipo de padrão?

• Como?

Page 3: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Padr

ões d

e Pr

ojet

o - D

ecor

ator

PADRÃO DECORATOR

Anexa responsabilidades adicionaisa um objeto de maneira dinâmica.

Page 4: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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.

Page 5: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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.

Page 6: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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.

Page 7: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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?

Page 8: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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!

Page 9: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

• 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?

Page 10: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Padr

ões d

e Pr

ojet

o - D

ecor

ator

Page 11: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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.

Page 12: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Ok... Então, qual é a melhor

solução para StarBuzz?12

Page 13: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Solução 3 (a melhor entre elas):

PADRÃO DECORATOR!Considera os princípio de herança/composição e aberto/fechado.

13

Page 14: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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

Page 15: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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!

Page 16: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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

Page 17: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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.

Page 18: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Padr

ões d

e Pr

ojet

o - D

ecor

ator

Terminologia e estruturatambém pode ser classe abstrata, dependendo do contexto

Page 19: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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.

Page 20: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

Bebida, a nossa superclasse.

20Onde calculamos o preço de um CafeTradicional.

Page 21: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

21

Onde calculamos o preço do Chocolate + CafeTradicional.

Bebida que estamos englobando.

Os decoradores precisam ser do mesmo tipo que as bebidas.

Page 22: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

22

Pedido: Um café tradicional,com chocolate,com leite.

Resultado...

Page 23: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

• 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

Page 24: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

• 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

Page 25: Padrões de Projeto Aula 5 – Padrão Decorator. QuickReview: Observer Definição: Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator

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