Post on 27-Jun-2015
description
Padrão DecoratorAnexa responsabilidades adicionaisa um objeto de maneira dinâmica.
2
Padrão Decorator
Para entender melhor,vamos imaginar a seguinte situação...
Juliane Silva
3
Padrão Decorator
Starbuzz Coffee, uma cafeteria famosa, deseja atualizar seu sistema para cor-responder a sua oferta de bebidas.
Juliane Silva
4
Padrão Decorator
O que a StarBuzz tem, por enquanto, é...
calcularPreco() é abstrato, para que as subclasses defi-nam sua implementação.
Juliane Silva
5Juliane Silva
Porém, a StarBuzz não oferece SÓ isso...
Os adicionais são o atrativo desse lugar!
E, como é cobrado um valor por adicional, é
preciso incluí-los no sistema.
Padrão Decorator
6
Padrão Decorator
Café? Com adicional?Como fazer isso? E dinamicamente?
Juliane Silva
7
Padrão Decorator
Solução 1: 1 classe para cada combinação.Tradicional + Leite; Tradicional + Espuma; Tradicional + Leite + Espuma, ...
Cada classe calcula o preço do café juntamente com o adicional pedido.
E quando o preço do leite aumentar?E quando um novo adicional entrar?
E quando? E quando?...
CANCELADA!
Juliane Silva
8
Padrão Decorator
Solução 2: variáveis para representar os adicionais.leite, espuma, creme, chocolate, ...
Calcula o total dos adicionais.
E se o preço do leite aumentar?E se chá gelado entrar? Sem leite, sem creme, sem nada.
Calcula o preço da bebida + adicionais (super.calcular Preco()).
E se o cliente quiser 2x creme?
CANCELADA!
Juliane Silva
9
Padrão Decorator
Ok... Então, qual é a melhor
solução para StarBuzz?Juliane Silva
10
Padrão Decorator
Solução 3 (a melhor entre elas):
PADRÃO DECORATOR!Considera os princípio de herança/composição e aberto/fechado.
Juliane Silva
11
Solução 3: padrão Decorator.Vamos começar com uma bebida e “decorá-la” no tempo de execução.
3. Decorá-lo com um objeto Leite.
4. Chamar calcularPreco() e contar com a delegação para adicionar o preço da bebida+adicionais.
1. Pegar um objeto CafeTradicional.
2. Decorá-lo com um objeto Choco-late.
Padrão Decorator
Juliane Silva
12
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.
Mas como se decora?Padrão Decorator
calcularPreco()Leite
calcularPreco()CafeTradicional
calcularPreco()Chocolate
calcularPreco()CafeTradicional
calcularPreco()CafeTradicional
calcularPreco()Chocolate
Juliane Silva
13
E como se calcula o preço de tudo isso?
Padrão Decorator
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.
Juliane Silva
14
Padrão Decorator
Enfim, temos a solução para o nosso problema!
Que é representada assim...
Componentes aos quais adi-cionamos dinamicamente um novo comportamento.
Os decoradores precisam da mesma interface dos componentes, porque ficam no lugar deles.
Os decoradores em-globam um compo-nente.
Juliane Silva
15
Padrão Decorator
E assim...
Bebida, a nossa superclasse.
Onde calculamos o preço de um CafeTradicional.
Juliane Silva
16
Padrão Decorator
Onde calculamos o preço do Chocolate+CafeTradicional.
Bebida que estamos englobando.
Os decoradores preci-sam ser do mesmo ti-po que as bebidas.
Juliane Silva
17
Padrão Decorator
Pedido: Um café tradicional,com chocolate,com leite.
Resultado...
Juliane Silva
18
Formalmente...
• 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 dinamicamen-te em tempo de execução.
Padrão Decorator
Juliane Silva
19
E, ao contrário da herança, que aplica funcionalidade a todos os objetos dela, ele permite
aplicar funcionalidades a um objeto específico.
Padrão Decorator
Juliane Silva
20
Obrigada!Referência Bibliográfica:
Padrão Decorator
Juliane Silva