SlideShare una empresa de Scribd logo
1 de 20
Padrão Decorator
Anexa responsabilidades adicionais
a um objeto de maneira dinâmica.
Padrão Decorator

Para entender melhor,
vamos imaginar a seguinte situação...

Juliane Silva

2
Padrão Decorator

Starbuzz Coffee, uma cafeteria famosa,
deseja atualizar seu sistema para corresponder a sua oferta de bebidas.

Juliane Silva

3
Padrão Decorator

O que a StarBuzz tem, por enquanto, é...

calcularPreco() é abstrato,
para que as subclasses definam sua implementação.

Juliane Silva

4
Padrão Decorator

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.
Juliane Silva

5
Padrão Decorator

Café? Com adicional?
Como fazer isso? E dinamicamente?

Juliane Silva

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

Juliane Silva

E quando o preço do leite aumentar?
E quando um novo adicional entrar?
E quando? E quando?...

7
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.
E se o cliente quiser 2x creme?

Calcula o preço da bebida
+ adicionais (super.calcular
Preco()).

Juliane Silva

8
Padrão Decorator

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

solução para StarBuzz?
Juliane Silva

9
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

10
Padrão Decorator

Solução 3: padrão Decorator.
Vamos começar com uma bebida e “decorá-la” no tempo de execução.
1. Pegar um objeto CafeTradicional.

3. Decorá-lo com um objeto Leite.

2. Decorá-lo com um objeto Choco-

4. Chamar calcularPreco() e contar

late.

Juliane Silva

com a delegação para adicionar
o preço da bebida+adicionais.

11
Padrão Decorator

Mas como se decora?
1. Começamos com o objeto CafeTradicional.
calcularPreco()
CafeTradicional

2. Criamos um objeto Chocolate e
englobamos CafeTradicional nele.
calcularPreco()
CafeTradicional

3. Criamos um decorador Leite e
colocamos Chocolate dentro.
calcularPreco()
CafeTradicional

calcularPreco()
Chocolate
calcularPreco()
Leite

calcularPreco()
Chocolate
Juliane Silva

12
Padrão Decorator

E como se calcula o preço de tudo isso?

calcularPreco()
CafeTradicional

3. Chocolate chama calcularPreco() de CafeTradicional.
2. Leite chama calcularPreco()
de Chocolate.
1. Chamamos calcularPreco()
do decorador externo, Leite.
Juliane Silva

calcularPreco()
Chocolate
calcularPreco()
Leite

4. CafeTradicional retorna seu valor.
5. Chocolate retorna seu valor
+ CafeTradicional
6. Leite retorna seu valor +
Chocolate, que é o valor total.
13
Padrão Decorator
Enfim, temos a solução para o nosso problema!

Que é representada assim...
Componentes aos quais adicionamos dinamicamente um
novo comportamento.

Os decoradores precisam
da mesma interface dos
componentes,
porque
ficam no lugar deles.

Os decoradores emglobam um componente.

Juliane Silva

14
Padrão Decorator

E assim...

Bebida, a nossa superclasse.

Onde calculamos o preço
de um CafeTradicional.
Juliane Silva

15
Padrão Decorator
Os decoradores precisam ser do mesmo tipo que as bebidas.

Bebida que estamos
englobando.

Onde calculamos o preço do
Chocolate+CafeTradicional.

Juliane Silva

16
Padrão Decorator

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

Resultado...

Juliane Silva

17
Padrão Decorator

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 dinamicamente em tempo de execução.
Juliane Silva

18
Padrão Decorator

E, ao contrário da herança, que aplica
funcionalidade a todos os objetos dela, ele permite
aplicar funcionalidades a um objeto específico.

Juliane Silva

19
Padrão Decorator

Obrigada!
Referência Bibliográfica:

Juliane Silva

20

Más contenido relacionado

La actualidad más candente

Instrumenting and Scaling Databases with Envoy
Instrumenting and Scaling Databases with EnvoyInstrumenting and Scaling Databases with Envoy
Instrumenting and Scaling Databases with EnvoyDaniel Hochman
 
(WEB202) Best Practices for Handling a 20x Traffic Spike | AWS re:Invent 2014
(WEB202) Best Practices for Handling a 20x Traffic Spike | AWS re:Invent 2014(WEB202) Best Practices for Handling a 20x Traffic Spike | AWS re:Invent 2014
(WEB202) Best Practices for Handling a 20x Traffic Spike | AWS re:Invent 2014Amazon Web Services
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱Suhyeon Jo
 
Desenvolvendo sistemas gigantes na internet com arquitetura baseada
Desenvolvendo sistemas gigantes na internet com arquitetura baseadaDesenvolvendo sistemas gigantes na internet com arquitetura baseada
Desenvolvendo sistemas gigantes na internet com arquitetura baseadaPaula Santana
 
Introduction to Spark (Intern Event Presentation)
Introduction to Spark (Intern Event Presentation)Introduction to Spark (Intern Event Presentation)
Introduction to Spark (Intern Event Presentation)Databricks
 
Banco de Dados I Aula 06 - Generalização e Especialização
Banco de Dados I Aula 06 - Generalização e EspecializaçãoBanco de Dados I Aula 06 - Generalização e Especialização
Banco de Dados I Aula 06 - Generalização e EspecializaçãoLeinylson Fontinele
 
Neo4j GraphTour Santa Monica 2019 - Amundsen Presentation
Neo4j GraphTour Santa Monica 2019 - Amundsen PresentationNeo4j GraphTour Santa Monica 2019 - Amundsen Presentation
Neo4j GraphTour Santa Monica 2019 - Amundsen PresentationTamikaTannis
 
Introduction to SQLAlchemy and Alembic Migrations
Introduction to SQLAlchemy and Alembic MigrationsIntroduction to SQLAlchemy and Alembic Migrations
Introduction to SQLAlchemy and Alembic MigrationsJason Myers
 
Normalização de dados - Primeira forma normal
Normalização de dados - Primeira forma normalNormalização de dados - Primeira forma normal
Normalização de dados - Primeira forma normalvitorleyva
 

La actualidad más candente (12)

Instrumenting and Scaling Databases with Envoy
Instrumenting and Scaling Databases with EnvoyInstrumenting and Scaling Databases with Envoy
Instrumenting and Scaling Databases with Envoy
 
(WEB202) Best Practices for Handling a 20x Traffic Spike | AWS re:Invent 2014
(WEB202) Best Practices for Handling a 20x Traffic Spike | AWS re:Invent 2014(WEB202) Best Practices for Handling a 20x Traffic Spike | AWS re:Invent 2014
(WEB202) Best Practices for Handling a 20x Traffic Spike | AWS re:Invent 2014
 
Reliable and Scalable Data Ingestion at Airbnb
Reliable and Scalable Data Ingestion at AirbnbReliable and Scalable Data Ingestion at Airbnb
Reliable and Scalable Data Ingestion at Airbnb
 
POO - Aula 09 - Herança
POO - Aula 09 - HerançaPOO - Aula 09 - Herança
POO - Aula 09 - Herança
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱
 
Desenvolvendo sistemas gigantes na internet com arquitetura baseada
Desenvolvendo sistemas gigantes na internet com arquitetura baseadaDesenvolvendo sistemas gigantes na internet com arquitetura baseada
Desenvolvendo sistemas gigantes na internet com arquitetura baseada
 
POO - 17 - Interfaces
POO - 17 - InterfacesPOO - 17 - Interfaces
POO - 17 - Interfaces
 
Introduction to Spark (Intern Event Presentation)
Introduction to Spark (Intern Event Presentation)Introduction to Spark (Intern Event Presentation)
Introduction to Spark (Intern Event Presentation)
 
Banco de Dados I Aula 06 - Generalização e Especialização
Banco de Dados I Aula 06 - Generalização e EspecializaçãoBanco de Dados I Aula 06 - Generalização e Especialização
Banco de Dados I Aula 06 - Generalização e Especialização
 
Neo4j GraphTour Santa Monica 2019 - Amundsen Presentation
Neo4j GraphTour Santa Monica 2019 - Amundsen PresentationNeo4j GraphTour Santa Monica 2019 - Amundsen Presentation
Neo4j GraphTour Santa Monica 2019 - Amundsen Presentation
 
Introduction to SQLAlchemy and Alembic Migrations
Introduction to SQLAlchemy and Alembic MigrationsIntroduction to SQLAlchemy and Alembic Migrations
Introduction to SQLAlchemy and Alembic Migrations
 
Normalização de dados - Primeira forma normal
Normalização de dados - Primeira forma normalNormalização de dados - Primeira forma normal
Normalização de dados - Primeira forma normal
 

Destacado

O Mítico Homem-Mês
O Mítico Homem-MêsO Mítico Homem-Mês
O Mítico Homem-MêsJuliane Silva
 
Decorator - Padrões de projeto
Decorator - Padrões de projetoDecorator - Padrões de projeto
Decorator - Padrões de projetoEduardo Mendes
 
Decorator Design Pattern
Decorator Design PatternDecorator Design Pattern
Decorator Design Patternfaelcavalcanti
 
Arquitetura ARM - Raspberry Pi
Arquitetura ARM - Raspberry PiArquitetura ARM - Raspberry Pi
Arquitetura ARM - Raspberry PiJuliane Silva
 

Destacado (7)

O Mítico Homem-Mês
O Mítico Homem-MêsO Mítico Homem-Mês
O Mítico Homem-Mês
 
Decorator - Padrões de projeto
Decorator - Padrões de projetoDecorator - Padrões de projeto
Decorator - Padrões de projeto
 
Decorator Design Pattern
Decorator Design PatternDecorator Design Pattern
Decorator Design Pattern
 
Prototype
PrototypePrototype
Prototype
 
Framework Yii
Framework YiiFramework Yii
Framework Yii
 
Arquitetura ARM - Raspberry Pi
Arquitetura ARM - Raspberry PiArquitetura ARM - Raspberry Pi
Arquitetura ARM - Raspberry Pi
 
Padrões de Projeto
Padrões de ProjetoPadrões de Projeto
Padrões de Projeto
 

Padrão de Projeto - Decorator

  • 1. Padrão Decorator Anexa responsabilidades adicionais a um objeto de maneira dinâmica.
  • 2. Padrão Decorator Para entender melhor, vamos imaginar a seguinte situação... Juliane Silva 2
  • 3. Padrão Decorator Starbuzz Coffee, uma cafeteria famosa, deseja atualizar seu sistema para corresponder a sua oferta de bebidas. Juliane Silva 3
  • 4. Padrão Decorator O que a StarBuzz tem, por enquanto, é... calcularPreco() é abstrato, para que as subclasses definam sua implementação. Juliane Silva 4
  • 5. Padrão Decorator 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. Juliane Silva 5
  • 6. Padrão Decorator Café? Com adicional? Como fazer isso? E dinamicamente? Juliane Silva 6
  • 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. Juliane Silva E quando o preço do leite aumentar? E quando um novo adicional entrar? E quando? E quando?... 7
  • 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. E se o cliente quiser 2x creme? Calcula o preço da bebida + adicionais (super.calcular Preco()). Juliane Silva 8
  • 9. Padrão Decorator Ok... Então, qual é a melhor solução para StarBuzz? Juliane Silva 9
  • 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 10
  • 11. Padrão Decorator Solução 3: padrão Decorator. Vamos começar com uma bebida e “decorá-la” no tempo de execução. 1. Pegar um objeto CafeTradicional. 3. Decorá-lo com um objeto Leite. 2. Decorá-lo com um objeto Choco- 4. Chamar calcularPreco() e contar late. Juliane Silva com a delegação para adicionar o preço da bebida+adicionais. 11
  • 12. Padrão Decorator Mas como se decora? 1. Começamos com o objeto CafeTradicional. calcularPreco() CafeTradicional 2. Criamos um objeto Chocolate e englobamos CafeTradicional nele. calcularPreco() CafeTradicional 3. Criamos um decorador Leite e colocamos Chocolate dentro. calcularPreco() CafeTradicional calcularPreco() Chocolate calcularPreco() Leite calcularPreco() Chocolate Juliane Silva 12
  • 13. Padrão Decorator E como se calcula o preço de tudo isso? calcularPreco() CafeTradicional 3. Chocolate chama calcularPreco() de CafeTradicional. 2. Leite chama calcularPreco() de Chocolate. 1. Chamamos calcularPreco() do decorador externo, Leite. Juliane Silva calcularPreco() Chocolate calcularPreco() Leite 4. CafeTradicional retorna seu valor. 5. Chocolate retorna seu valor + CafeTradicional 6. Leite retorna seu valor + Chocolate, que é o valor total. 13
  • 14. Padrão Decorator Enfim, temos a solução para o nosso problema! Que é representada assim... Componentes aos quais adicionamos dinamicamente um novo comportamento. Os decoradores precisam da mesma interface dos componentes, porque ficam no lugar deles. Os decoradores emglobam um componente. Juliane Silva 14
  • 15. Padrão Decorator E assim... Bebida, a nossa superclasse. Onde calculamos o preço de um CafeTradicional. Juliane Silva 15
  • 16. Padrão Decorator Os decoradores precisam ser do mesmo tipo que as bebidas. Bebida que estamos englobando. Onde calculamos o preço do Chocolate+CafeTradicional. Juliane Silva 16
  • 17. Padrão Decorator Pedido: Um café tradicional, com chocolate, com leite. Resultado... Juliane Silva 17
  • 18. Padrão Decorator 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 dinamicamente em tempo de execução. Juliane Silva 18
  • 19. Padrão Decorator E, ao contrário da herança, que aplica funcionalidade a todos os objetos dela, ele permite aplicar funcionalidades a um objeto específico. Juliane Silva 19