A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Aula 5 – Padrão Decorator

Apresentações semelhantes


Apresentação em tema: "Aula 5 – Padrão Decorator"— Transcrição da apresentação:

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

2 QuickReview: Observer Definição:
Quando usar? Tipo de padrão? Como? Padrões de Projeto - Decorator Def: padrão usado quando existe uma relação um-para-muitos entre os objetos, de modo que sempre que o objeto principal (subject) for modificado seus objetos dependentes (observers) sejam notificados automaticamente. Quando usar? Quando existir uma relação de dependência um-para-muitos. Tipo de padrão? Comportamental (padrões comportamentais são basicamente padrões de comunicações entre os objetos) Como? Interfaces Subject e Observer Lembrar de programar para superclasses! Assim podemos ter uma maior gama de observadores. ;-)

3 Padrão decorator Anexa responsabilidades adicionais
a um objeto de maneira dinâmica. Padrões de Projeto - Decorator

4 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 de Projeto - Decorator

5 Quando eles entraram no negócio, projetaram suas classes assim:
calcularPreco() é abstrato, para que as subclasses defi-nam sua implementação. Padrões de Projeto - Decorator

6 Os adicionais são o atrativo desse lugar!
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 de Projeto - Decorator

7 Temos o café e os adicionais
Temos o café e os adicionais... Como o café deve ser montado dinamicamente? Como esse preço deve ser calculado dinamicamente? Padrões de Projeto - Decorator

8 Solução I: uma classe para cada combinação
Tradicional + Leite; Tradicional + Espuma; Tradicional + Leite + Espuma, ... Isso nos daria uma combinação de quantas classes? E quando o leite aumentar? E quando um novo adicional entrar? Cada classe calcula o preço do café com o seu adicional. CANCELADA! Padrões de Projeto - Decorator

9 Solução II: variáveis para representar os adicionais
Leite, espuma, creme, chocolate 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? Calcula o custo total dos adicionais. E se o preço dos adicionais mudarem? Será preciso alterar o código existente. E se surgirem novos condimentos? Será preciso adicionar novos métodos. E se chá gelado entrar no cardápio? Ele vai herdar métodos que tira a semântica e coesão do sistema. Faz sentido tomar chá gelado com creme? E se um cliente quiser um moca (chocolate) duplo? O nosso sistema simplesmente não suporta. Retorna o preço de cada bebida + adicionais.

10 Padrões de Projeto - Decorator
Pág 62 do livro use a cabeça ou 81 do PDF use a cabeça.

11 O princípio Aberto-Fechado
As classes devem estar abertas para extensão mas fechadas para modificação. 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. Padrões de Projeto - Decorator

12 Ok... Então, qual é a melhor solução para StarBuzz?

13 PADRÃO DECORATOR! Solução 3 (a melhor entre elas):
Considera os princípio de herança/composição e aberto/fechado.

14 Solução III: padrão Decorator
O cliente primeiro escolhe o tipo de bebida, e depois escolhe os adicionais em tempo de execução. Ok, senhor! Só um minutinho, já digo quanto custa. ;-) Com quais adicionais, senhor? Senhor, pode me falar o seu pedido... Mais algum adicional, senhor? E com leite! Desejo um café tradicional... Com chocolate... Padrões de Projeto - Decorator

15 Solução III: padrão Decorator
Vamos lá: Café tradicional: R$1.50 Adicional de chocolate: R$1.00 Adicional de leite: R$0.50 Custa 3 reais, senhor! Padrões de Projeto - Decorator

16 Em termos de implementação, como é possível decorar os objetos?
Começamos com o objeto Cafe-Tradicional. Criamos um objeto Chocolate e englobamos CafeTradicional nele. Criamos um decorador Leite e colocamos Chocolate dentro. calcularPreco() CafeTradicional calcularPreco() CafeTradicional Padrões de Projeto - Decorator calcularPreco() Chocolate calcularPreco() CafeTradicional calcularPreco() Leite calcularPreco() Chocolate

17 E como é calculado o preço desse café e seus adicionais?
calcularPreco() CafeTradicional 4. CafeTradicional re-torna seu valor. 3. Chocolate chama calcular-Preco() de CafeTradicional. 5. Chocolate retorna seu valor + CafeTradicional Padrões de Projeto - Decorator calcularPreco() Chocolate 2. Leite chama calcularPreco() de Chocolate. calcularPreco() Leite 6. Leite retorna seu valor + Chocolate, que é o valor total. 1. Chamamos calcularPreco() do decorador externo, Leite.

18 Terminologia e estrutura
também pode ser classe abstrata, dependendo do contexto Padrões de Projeto - Decorator

19 Componentes aos quais adicionamos dinamicamente um novo comportamento.
Os decoradores precisam da mesma interface dos componentes, porque ficam no lugar deles. Componentes aos quais adicionamos dinamicamente um novo comportamento. Padrões de Projeto - Decorator Os decoradores englobam um componente.

20 Bebida, a nossa superclasse.
Onde calculamos o preço de um CafeTradicional.

21 Os decoradores precisam ser do mesmo tipo que as bebidas.
Bebida que estamos englobando. Onde calculamos o preço do Chocolate + CafeTradicional.

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

23 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.

24 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.

25 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: Padrões de Projeto - Decorator


Carregar ppt "Aula 5 – Padrão Decorator"

Apresentações semelhantes


Anúncios Google