SlideShare uma empresa Scribd logo
1 de 10
Rafael Rocha Cavalcanti
                  blog: faelcavalcanti.wordpress.com
                   e-mail: faelcavalcanti@gmail.com




                        Decorator
                                                       Pattern
                                    Estrutural (GoF) :: Extensão (Metsker)

“Anexar responsabilidades adicionais a um objeto dinamicamente.
Decorators oferecem uma alternativa flexível ao uso de herança
para estender uma funcionalidade." [GoF : Págs:170-179]
Decorator :> Cenário 1
• Necessitamos criar uma cadeia de objetos, em que estes sejam
  responsáveis por novas funcionalidades
• A partir daí podemos encadear as funções na ordem desejada




                            Y
                                                     Z
        X
                            L
                                                     E
        I                   K
                                                     D
       H                    J
                                                     C
                                                     B

                   G
                                   A
Decorator :> Cenário 2

 •   De uma forma análoga ao nosso enfoque, temos que:
     •   Objetivo é separar construção dessa cadeia do cliente que a usa
     •   Encadeamento é efetuado na ordem correta necessária ao invés de controles
     •   Esta cadeia sempre inicia c/componente e finaliza c/componente concreto


Componente               Componente
 Decorator                Decorator                                  Y
    J                        L
                                                                     L
                                                                     K
                                                                    J

      Componente                 Componente
       Decorator                  Concreto               Executar Ações
          K                         Y
                                                   Resultado = J + K + L + Y
Decorator :> Estudo de Caso(CyberCafé)

•   Requisitos :: Sistema CyberCafé
    1.   Em uma determinada “CyberCafé” deseja-se determinar o custo
         de cafés com ingredientes adicionais, como leite, canela, etc.
    2.   Sabendo que cada café tem seu preço individual, como efetuar o
         cálculo deste custo, somando-se a cada ingrediente adicional ?
    3.   Segue abaixo modelo sugerido de design
Decorator :> Apresentação

•   Padrão também chamado de Wrapper
•   Utilizar quando a herança geraria uma explosão de subclasses
•   Classe Decorator é preferivelmente abstrata e possui um Componente
•   Cada [ConcreteDecorator] executa sua operação e chama operação da
    classe [Decorador], que por sua vez chama da classe [Componente]




          Classificação = Estrutural (GoF) e de Extensão (Metsker)
Decorator :> Estudo de Caso(CyberCafé)
 o    Solução final após aplicação do padrão! Vamos executar o projeto!




Este é um exemplo da série
 Head First Design Pattern
Decorator :> Exercício :: 10 Minutos

•   Vamos revisar aprendendo como usar uma implementação deste
    1.   Abra o arquivo [decorator.example.MainJavaIO] e execute-o
    2.   Refatore cada forma de leitura para um método separado
    3.   Que tipo de implementações este possui ?
    4.   Adicione nova implementação que exibe os números em binário


•   Seguindo mesma abordagem acima, vamos ler, converter e salvar!
    1.   Implemente um novo algoritmo que consiga ler uma linha inteira
          Dica: Utilize BufferReader
    2.   Agora obtenha o resultado acima e salve-o em um arquivo
          Dica 1: Utilize a variável (HelperFile .path + NomeQualquer)
          Dica 2: Utilize o encadeamento:
                 PrintWriter - BufferedWriter - FileWriter
Decorator :> Exercício :: 10 Minutos

•   Agora que já sabemos como utilizar o padrão decorator, vamos
    implementar um gerador de código HTML com proposta abaixo:




•   Observãções:
    1.   Crie uma classe Cliente
    2.   Nas subclasses de componente faça a
                 implementação do método getHTML() seguir as
                          recomendações da W3C
    3.   Obtenha conteúdo html e passe para método Cliente.gerarHTML()
Decorator :> Revisando

•   Vantagens
    •   Possibilita qualquer número de combinações de comportamento
    •   Capacidade dinâmica de adicionar funções antes ou depois da
        funcionalidade da classe ComponenteConcreto
    •   Permite alternativa flexível à herança para estender funcionalidade
    •   Adiciona responsabilidades a um objeto e não uma classe inteira

•   Desvantagens
    •   O Decorador e o objeto incluso não têm a mesma identidade, isto é,
        a verificação do método equals tende a ser sempre diferente
    •   Fácil de customizar mas pode ser difícil entender e depurar
    •   Em casos que a classe [Componente] encontra-se muito pesada, este
        passa a ser recomendável utilizar o padrão Strategy
Decorator :> Anexo I :: Pacote java.io

Mais conteúdo relacionado

Semelhante a Decorator Design Pattern

SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidVinícius Thiengo
 
Jquery - Apresentação e aplicação prática
Jquery - Apresentação e aplicação práticaJquery - Apresentação e aplicação prática
Jquery - Apresentação e aplicação práticaTeles Maciel
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesedgarddavidson.com
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Giovanni Bassi
 
2009_2Sem.POOII.Ciencia Aula2 Revisao De Classes E Objetos
2009_2Sem.POOII.Ciencia Aula2   Revisao De Classes E Objetos2009_2Sem.POOII.Ciencia Aula2   Revisao De Classes E Objetos
2009_2Sem.POOII.Ciencia Aula2 Revisao De Classes E Objetosguest9b4c7f
 
Web 2.0 com Ajax: JQuery/PHP (Aula 02)
Web 2.0 com Ajax: JQuery/PHP (Aula 02)Web 2.0 com Ajax: JQuery/PHP (Aula 02)
Web 2.0 com Ajax: JQuery/PHP (Aula 02)Wagner Silva
 
BDD com specflow e selenium webdriver
BDD com specflow e selenium webdriverBDD com specflow e selenium webdriver
BDD com specflow e selenium webdriverCristian Mathias
 
Padrões de projetos
Padrões de projetosPadrões de projetos
Padrões de projetosGustavo Souza
 
Componentizando a Web com Polymer
Componentizando a Web com PolymerComponentizando a Web com Polymer
Componentizando a Web com PolymerStefan Horochovec
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Luís Cobucci
 
JHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosJHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosThiago Soares
 

Semelhante a Decorator Design Pattern (20)

Padrões de Projeto para Jogos
Padrões de Projeto para JogosPadrões de Projeto para Jogos
Padrões de Projeto para Jogos
 
SelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView AndroidSelectionTracker Para Seleção de Itens no RecyclerView Android
SelectionTracker Para Seleção de Itens no RecyclerView Android
 
Jquery - Apresentação e aplicação prática
Jquery - Apresentação e aplicação práticaJquery - Apresentação e aplicação prática
Jquery - Apresentação e aplicação prática
 
Design Patterns - Adapter e Decorator
Design Patterns - Adapter e DecoratorDesign Patterns - Adapter e Decorator
Design Patterns - Adapter e Decorator
 
Curso de ReactJS
Curso de ReactJSCurso de ReactJS
Curso de ReactJS
 
Angular 2
Angular 2Angular 2
Angular 2
 
Começando com React.js
Começando com React.jsComeçando com React.js
Começando com React.js
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrões
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2
 
2009_2Sem.POOII.Ciencia Aula2 Revisao De Classes E Objetos
2009_2Sem.POOII.Ciencia Aula2   Revisao De Classes E Objetos2009_2Sem.POOII.Ciencia Aula2   Revisao De Classes E Objetos
2009_2Sem.POOII.Ciencia Aula2 Revisao De Classes E Objetos
 
Web 2.0 com Ajax: JQuery/PHP (Aula 02)
Web 2.0 com Ajax: JQuery/PHP (Aula 02)Web 2.0 com Ajax: JQuery/PHP (Aula 02)
Web 2.0 com Ajax: JQuery/PHP (Aula 02)
 
BDD com specflow e selenium webdriver
BDD com specflow e selenium webdriverBDD com specflow e selenium webdriver
BDD com specflow e selenium webdriver
 
Padrões de projetos
Padrões de projetosPadrões de projetos
Padrões de projetos
 
Componentizando a Web com Polymer
Componentizando a Web com PolymerComponentizando a Web com Polymer
Componentizando a Web com Polymer
 
Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
 
Patterns
PatternsPatterns
Patterns
 
JHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãosJHipster - Produtividade e Maturidade em suas mãos
JHipster - Produtividade e Maturidade em suas mãos
 
Refatoração
RefatoraçãoRefatoração
Refatoração
 
Padrões de projeto
Padrões de projetoPadrões de projeto
Padrões de projeto
 
Ajax continuação
Ajax continuaçãoAjax continuação
Ajax continuação
 

Último

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 

Último (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 

Decorator Design Pattern

  • 1. Rafael Rocha Cavalcanti blog: faelcavalcanti.wordpress.com e-mail: faelcavalcanti@gmail.com Decorator Pattern Estrutural (GoF) :: Extensão (Metsker) “Anexar responsabilidades adicionais a um objeto dinamicamente. Decorators oferecem uma alternativa flexível ao uso de herança para estender uma funcionalidade." [GoF : Págs:170-179]
  • 2. Decorator :> Cenário 1 • Necessitamos criar uma cadeia de objetos, em que estes sejam responsáveis por novas funcionalidades • A partir daí podemos encadear as funções na ordem desejada Y Z X L E I K D H J C B G A
  • 3. Decorator :> Cenário 2 • De uma forma análoga ao nosso enfoque, temos que: • Objetivo é separar construção dessa cadeia do cliente que a usa • Encadeamento é efetuado na ordem correta necessária ao invés de controles • Esta cadeia sempre inicia c/componente e finaliza c/componente concreto Componente Componente Decorator Decorator Y J L L K J Componente Componente Decorator Concreto Executar Ações K Y Resultado = J + K + L + Y
  • 4. Decorator :> Estudo de Caso(CyberCafé) • Requisitos :: Sistema CyberCafé 1. Em uma determinada “CyberCafé” deseja-se determinar o custo de cafés com ingredientes adicionais, como leite, canela, etc. 2. Sabendo que cada café tem seu preço individual, como efetuar o cálculo deste custo, somando-se a cada ingrediente adicional ? 3. Segue abaixo modelo sugerido de design
  • 5. Decorator :> Apresentação • Padrão também chamado de Wrapper • Utilizar quando a herança geraria uma explosão de subclasses • Classe Decorator é preferivelmente abstrata e possui um Componente • Cada [ConcreteDecorator] executa sua operação e chama operação da classe [Decorador], que por sua vez chama da classe [Componente] Classificação = Estrutural (GoF) e de Extensão (Metsker)
  • 6. Decorator :> Estudo de Caso(CyberCafé) o Solução final após aplicação do padrão! Vamos executar o projeto! Este é um exemplo da série Head First Design Pattern
  • 7. Decorator :> Exercício :: 10 Minutos • Vamos revisar aprendendo como usar uma implementação deste 1. Abra o arquivo [decorator.example.MainJavaIO] e execute-o 2. Refatore cada forma de leitura para um método separado 3. Que tipo de implementações este possui ? 4. Adicione nova implementação que exibe os números em binário • Seguindo mesma abordagem acima, vamos ler, converter e salvar! 1. Implemente um novo algoritmo que consiga ler uma linha inteira  Dica: Utilize BufferReader 2. Agora obtenha o resultado acima e salve-o em um arquivo  Dica 1: Utilize a variável (HelperFile .path + NomeQualquer)  Dica 2: Utilize o encadeamento: PrintWriter - BufferedWriter - FileWriter
  • 8. Decorator :> Exercício :: 10 Minutos • Agora que já sabemos como utilizar o padrão decorator, vamos implementar um gerador de código HTML com proposta abaixo: • Observãções: 1. Crie uma classe Cliente 2. Nas subclasses de componente faça a implementação do método getHTML() seguir as recomendações da W3C 3. Obtenha conteúdo html e passe para método Cliente.gerarHTML()
  • 9. Decorator :> Revisando • Vantagens • Possibilita qualquer número de combinações de comportamento • Capacidade dinâmica de adicionar funções antes ou depois da funcionalidade da classe ComponenteConcreto • Permite alternativa flexível à herança para estender funcionalidade • Adiciona responsabilidades a um objeto e não uma classe inteira • Desvantagens • O Decorador e o objeto incluso não têm a mesma identidade, isto é, a verificação do método equals tende a ser sempre diferente • Fácil de customizar mas pode ser difícil entender e depurar • Em casos que a classe [Componente] encontra-se muito pesada, este passa a ser recomendável utilizar o padrão Strategy
  • 10. Decorator :> Anexo I :: Pacote java.io