Padrão Decorator
Projeto de Sistemas de Software
Hazel, Juliana e Luana
Sumário
• Decorator
– Introdução/Propósito
– Motivação
– Aplicabilidade
– Estrutura
– Participantes
– Colaborações
– Conseqüências
– Exemplo de Código
© LES/PUC-Rio
Introdução/Propósito
• É um padrão estrutural
– Classificação GoF
– Compor estruturas complexas
• Dinamicamente, agregar responsabilidades adicionais a um
objeto
• Fornecem uma alternativa flexível ao uso de subclasses para
extensão de funcionalidades
© LES/PUC-Rio
Motivação (1/3)
• Acrescentar responsabilidades a objetos individuais e não a
toda uma classe
• Exemplo: Ferramenta para construção de interfaces gráficas
de usuário
• Duas formas:
– Herança
• Escolha de propriedades e bordas estaticamente
• Explosão de classes
– Decorator
• Embutir o componente em outro objeto que acrescenta a borda
© LES/PUC-Rio
Motivação (2/3)
VisualComponent
Draw()
TextView
Decorator
Draw()
Draw()
ScrollDecorator
component
component->Draw()
BorderDecorator
Draw()
Draw()
ScrollTo()
DrawBorder()
scrollPosition
borderWidth
© LES/PUC-Rio
Decorator::Draw();
DrawBorder();
Motivação (3/3)
• Diagrama de objetos
aBorderDecorator
component
aScrollDecorator
component
© LES/PUC-Rio
aTextView
Aplicabilidade
• Para acrescentar responsabilidades a objetos individuais
– De forma dinâmica e transparente
• Para responsabilidades que podem ser removidas
• Quando a extensão através do uso de subclasses não é
prática
© LES/PUC-Rio
Estrutura
Component
Operation()
component
ConcreteComponent
Decorator
Operation()
Operation()
component->Operation()
ConcreteDecoratorA
ConcreteDecoratorB
Operation()
Operation()
addedState
AddedBehavior()
© LES/PUC-Rio
Decorator::Operation();
AddedBehavior();
Participantes
• Component (VisualComponent)
– Define a interface para objetos que podem ter
responsabilidades acrescentadas aos mesmos dinamicamente
• ConcreteComponent (TextView)
– Define um objeto para o qual responsabilidades adicionais
podem ser atribuídas
• Decorator
– Mantém uma referência para um objeto Component e define
uma interface que segue a interface de Component
• ConcreteDecorator (BorderDecorator, ScrollDecorator)
– Acrescenta responsabilidades ao componente
© LES/PUC-Rio
Colaborações
• Decorator repassa solicitações para o seu objeto
Component.
• Subclasses do Decorator podem extender as solicitações
passadas para seu objeto Component.
• Opcionalmente, subclasses do Decorator podem executar
operações adicionais antes e depois de repassar a
solicitação.
© LES/PUC-Rio
Colaborações
© LES/PUC-Rio
Conseqüências
• Vantagens
– Maior flexibilidade do que a herança estática
– Evita classes sobrecarregadas de características na parte
superior da hierarquia
• Desvantagens
– Um decorator e o seu componente não são idênticos
– Grande quantidade de pequenos objetos
© LES/PUC-Rio
Exemplo de código
Estrutura
© LES/PUC-Rio
Abstract Component e Abstract Decorator
© LES/PUC-Rio
Concrete Components
© LES/PUC-Rio
Concrete Decorator
© LES/PUC-Rio
Testando o Decorator Pattern
© LES/PUC-Rio
Obrigada!
Download

Decorator - (LES) da PUC-Rio