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