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!