• Nenhum resultado encontrado

09 Padroes Decorator

N/A
N/A
Protected

Academic year: 2021

Share "09 Padroes Decorator"

Copied!
34
0
0

Texto

(1)

Padrão Decorator

Padrões e Frameworks

Roberto A. Bittencourt Jairo Calmon

(2)

2

Situação

• Na aula anterior vimos um exemplo de um

editor de documentos WYSIWYG.

• Tínhamos uma estrutura hierárquica com

relacionamentos Todo-Parte.

• Para esta aula, vamos abstrair e trabalhar

somente com:

– ElementoDeDocumentoIF (com um método

draw())

(3)

Situação

• No editor de documentos WYSIWYG, vamos

embelezar a interface do usuário (UI)

– Vamos adicionar uma borda à área de edição – Vamos adicionar barras de rolagem (scrollbars)

• Nota: A área de edição também é um

ElementoDeDocumento

”.

(4)

4

Situação

• “É simples... Criamos uma subclasse de

ElementoDeDocumento e adicionamos a borda”

• Criamos a classe ElementoDeDocumentoComBorda, e sobreescrevemos o método draw para também desenhar a borda.

• Funciona?

(5)

Situação

• Mas acontece uma coisa interessante nessa

abordagem que já deve ter acontecido algumas vezes com vocês...

• E se... Tivermos mais opções de embelezamento? • Bordas, Background, Scrollbars

• E se... Qualquer combinação fosse possível...

– Afinal eu posso ter um elemento com bordas, background e scrollbars... Ou só com bordas e background... Ou com background e scrollbar...

(6)

6

Situação

• ElementoDeDocumento • ElementoDeDocumentoComBorda • ElementoDeDocumentoComScrollbar • ElementoDeDocumentoComBackground • ElementoDeDocumentoComBordaEScrollbar • ElementoDeDocumentoComBordaEBackground • ElementoDeDocumentoComScrollBarEBackground • ElementoDeDocumentoComTudo

(7)

Situação

• Não vamos usar herança para adicionar este

embelezamento

– Não poderíamos mudar o embelezamento em tempo de execução

– Para n tipos de embelezamento, precisaríamos de 2n classes para ter todas as combinações

• Teremos mais flexibilidade se outros objetos

da UI não souberem que está havendo

(8)

8

Inclusão Transparente

• Usar composição em vez de herança evita os

problemas mencionados, mas quais objetos

devem participar da composição?

• O embelezamento em si será um objeto

(digamos uma instância da classe Borda)

(9)

Inclusão Transparente

• Temos dois objetos para fazer a composição:

ElementoDeDocumento e Borda.

• Observe que agora podemos ter uma borda a redor de qualquer ElementoDeDocumento e não só a redor da área de edição

• Devemos decidir agora quem vai compor quem...

– Uma restrição importante é que clientes devem tratar apenas objetos ElementoDeDocumento e não deveriam saber se um ElementoDeDocumento tem uma Borda ou não!

(10)

10

(11)

Inclusão Transparente

• A

Borda

pode conter o

ElementoDeDocumento

– Faz sentido já que a Borda engloba o

ElementoDeDocumento na tela

• O

ElementoDeDocumento

pode conter a

Borda

– Isso implica em mudar a classe

ElementoDeDocumento para que ela conheça a Borda

(12)

12

Inclusão Transparente

• Usaremos a primeira escolha de forma a

manter o código que trata bordas

inteiramente na classe

Borda

sem mexer nas

outras classes

(13)

Inclusão Transparente

• Usaremos a primeira escolha de forma a

manter o código que trata bordas

inteiramente na classe

Borda

sem mexer nas

outras classes

(14)

14

Inclusão Transparente

• Já que a Borda vai incluir o ElementoDeDocumento, é a Borda que será "vista" pelo cliente

• Mas o cliente só trata com ElementoDeDocumento! • Isso implica que a Borda tem a mesma interface que

ElementoDeDocumento

– Fazemos Borda uma subclasse de ElementoDeDocumento para garantir este relacionamento

• Isso também faz sentido porque a borda ter uma aparência gráfica na tela e tudo que tem aparência gráfica é

(15)

Inclusão Transparente

• Este conceito chama-se "Inclusão Transparente"

– Composição com um único filho – Interfaces compatíveis

• Clientes não sabem se estão tratando do objeto

original (ElementoDeDocumento) ou do seu incluidor (Borda)

• O incluidor delega as operações para o objeto

incluído, mas aumenta o comportamento fazendo seu trabalho antes ou depois da delegação da operação

(16)

16

MonoElementoDeDocumento

• Definimos uma subclasse de ElementoDeDocumento

chamada MonoElementoDeDocumento

• MonoElementoDeDocumento é uma classe abstrata para todos os ElementoDeDocumento de

embelezamento

• MonoElementoDeDocumento armazena uma

referência a um único ElementoDeDocumento (daí "mono") e encaminha todos os pedidos para ele

– Isso é chamado Forwarding ou Delegação

(17)
(18)

18

MonoElementoDeDocumento

• Isso faz com que MonoElementoDeDocumento seja completamente transparente aos clientes

• A classe MonoElementoDeDocumento vai

reimplementar pelo menos um dos métodos de

ElementoDeDocumento para fazer seu trabalho • Exemplo: Borda redefine o método draw()

(19)

MonoElementoDeDocumento

public abstract class MonoElementoDeDocumento extends ElementoDeDocumento{ private ElementoDeDocumentoIF componente;

public void draw() { componente.draw(); }

}

public class Borda extends MonoElementoDeDocumento { private void drawBorda(){ ... }

public void draw() { super.draw(); drawBorda(); }

... }

(20)

20

Decorator

• Este padrão chama-se Decorator

– Embelezamento usando inclusão transparente – Observe que o embelezamento pode, na

realidade, ser qualquer adição de

responsabilidades e não um "embelezamento visual"

• Ex. embeleza uma árvore de sintaxe com ações semânticas

• Ex. embeleza uma máquina de estados finitos com novas transições

(21)

Decorator

• Como faríamos para a classe Scrollbar?

• Podemos modelar ela também como um

(22)

22

Decorator

• Sim... Podemos...

• Ela desenha seu Componente em posições diferentes dependendo de duas barras de rolagem

• Ela adiciona as barras de rolagem como embelezamento

• Ao desenhar seu Componente, ScrollBar pede ao

sistema gráfico para fazer "clipping" do Componente nos limites apropriados

(23)

Decorator

• Agora, como adicionar uma Borda e um

ScrollBar?

(24)

24

Decorator

• Compomos os

ElementosAFormatar

dentro

de um

ScrollBar

e este dentro de uma

Borda

– Se compuséssemos a Borda dentro do

ScrollBar, a borda seria rolada também

• Se isso for o comportamento desejado, essa ordem deve ser usada

(25)
(26)

26

PADRÃO DECORATOR

(WRAPPER)

(27)

Objetivo

• Adicionar responsabilidades dinamicamente a

um objeto

• Decoradores provêem uma alternativa flexível

à herança para estender funcionalidade

• Permitem adicionar responsabilidades a um

objeto e não a uma classe inteira

(28)

28

Quando usar o padrão Decorator

• Para adicionar responsabilidades dinamicamente a objetos individuais e transparentemente (sem afetar outros objetos)

• Quando há responsabilidades que podem ser retiradas • Quando a herança geraria uma explosão de subclasses • Quando a herança seria uma boa alternativa mas a

definição da classe está escondida ou não disponível para herança

(29)
(30)

30

Participantes

• ComponenteIF (ex. ElementoDeDocumentoIF)

– Define a interface de objetos que podem ter responsabilidades adicionadas dinamicamente

• Componente (ex. ElementoDeDocumento)

– Possível classe abstrata para fatorar o código comum dos ComponenteConcreto

• ComponenteConcreto (ex. ElementosAFormatar)

– Define um objeto ao qual se pode adicionar responsabilidades adicionais

• Decorador (ex. MonoElementoDeDocumento)

– Mantém uma referência a um objeto ComponenteIF e define uma interface igual à do Componente

• DecoradorConcreto (ex. Borda, Rolador)

(31)

Colaborações

• O Decorador encaminha pedidos ao Componente • Pode opcionalmente adicionar operações antes ou

(32)

32

Consequências

• Mais flexível do que herança estática

– Pode adicionar responsabilidades dinamicamente

– Pode até adicionar responsabilidades duas vezes! (ex. borda dupla)

• Evita classes com features demais no topo da hierarquia

– Em vez de tentar prever todos os features numa classe complexa e customizável, permite definir classes simples e adicionar

funcionalidade de forma incremental com objetos decoradores

– Desta forma, as aplicações não têm que pagar pelos features que não usam

(33)

Consequências (Pontos Negativos)

• O Decorador e o objeto incluso não têm a mesma

identidade

– Portanto, cuidado com a identidade de objetos: um Decorador adicionado a um objeto vai mudar o objeto com o qual o cliente lida (em termos de identidade)

• Muitos pequenos objetos

– Fácil de customizar por programadores que entendem o projeto mas pode ser difícil entender e depurar

(34)

34

Considerações de Implementação

• A interface do decorador deve ser igual à interface do objeto sendo decorado

• Se tiver que adicionar apenas uma única responsabilidade, pode-se remover o decorador abstrato

– Neste caso, o decorador concreto pode tratar do forwarding para o Componente incluso

• Mantendo Componentes enxutos

– A classe Componente deve ser mantida enxuta e os dados ser definidos nos Componentes concretos

– Caso contrário, os decoradores (que herdam de Componente) ficam "pesados"

Referências

Documentos relacionados

O cabeça de lista da CDU à Câmara da Figueira da Foz, Bernardo Reis, critica a rede ineficaz de trans- portes públicos na cidade e no concelho para, no primeiro dia da

Público alvo: Crianças a partir de 6 anos,adolescentes e jovens de todas as idades Recursos: Material e utensílios para fazer bolos.. Objetivo: Diversão, interação, exposição

EMBELEZAMENTO E POLÍTICA URBANA NA RENOVAÇÃO DA IMAGEM DE COIMBRA. ■ Margarida Relvão

Por outro lado, ainda no ano de 1874 e, como contrapartida pelo traçado da Linha da Beira Alta não passar pela cidade 37 , o Governo propôs a construção de um ramal entre a

Por outro lado, os princípios básicos de economia nos permitem criar a seguinte técnica de avaliação: o valor definido para os ativos menos o valor definido para os passivos é

6; incluir na parte frontal da aba no mínimo uma impressão (no mínimo em 5 cores) retangular medindo no mínimo (15cm altura x 10cm largura) contendo os desenhos e

As atividades assíncronas, ou seja, não presenciais, serão realizadas no Ambiente Virtual de Aprendizagem (AVA) especialmente preparado para a sua formação. Você

Os irmãos que estão frequen- tando a Igreja e desejam tor- nar-se membros de nossa co- munidade devem procurar o Pastor, Rev. Os que ainda não foram ba- tizados são convidados a