Você está na página 1de 20

INF011 Padres de Projeto

12 Decorator
Sandro Santos Andrade
sandroandrade@ifba.edu.br
Instituto Federal de Educao, Cincia e Tecnologia da Bahia
Departamento de Tecnologia Eletro-Eletrnica
Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Propsito:

Anexar, de forma dinmica, responsabilidades adicionais a


um objeto. Representa uma alternativa flexvel herana
de implementao ao realizar extenso de funcionalidades

Tambm conhecido como: Wrapper

Motivao:

s vezes necessrio adicionar responsabilidades


somente a objetos especficos, ao invs de a classes
inteiras
Ex: um toolkit grfico pode permitir acrescentar bordas ou
scrolling a qualquer widget
Pode-se herdar de uma classe que implementa a borda,
porm toda instncia da sub-classe ter uma borda

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Motivao:

Entretanto, a soluo inflexvel pois a escolha da borda


realizada de forma esttica, o cliente no pode
controlar como e quando decorar o widget com uma
borda
Uma abordagem mais flexvel encapsular o widget em
um outro objeto, que adiciona a borda (decorator)
O decorator expe a mesma interface do widget de modo
que sua presena transparente para o cliente
O decorator repassa as requisies para o widget e pode
realizar aes adicionais (tais como o desenho da
borda) antes ou depois do repasse
Pode-se utilizar decorators aninhados de forma recursiva,
provendo portanto um nmero ilimitado de
responsabilidades adicionadas

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Motivao:

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Motivao:

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Aplicabilidade:

Deseja-se adicionar responsabilidades a objetos


individuais de forma dinmica e transparente, ou seja, sem
afetar outros objetos
Deseja-se ter responsabilidades que podem ser retiradas
de um objeto especfico
Quando extenso por herana de implementao
impraticvel:

Exploso de sub-classes gerada pela combinao de um


grande nmero de extenses independentes
Definio da classe no disponvel

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Estrutura:

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Participantes:

Component (VisualComponent):

ConcreteComponent (TextView):

Define um objeto no qual pode-se anexar


responsabilidades adicionais

Decorator:

Define a interface dos objetos que podem ter


responsabilidades a eles adicionadas dinamicamente

Mantm uma referncia para um objeto Component e


define uma interface em conformidade com a interface
de Component

ConcreteDecorator (BorderDecorator, ScrollDecorator):

Adiciona responsabilidades ao componente

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Colaboraes:

O decorator repassa requisies ao seu objeto


Component. Pode, opcionalmente, realizar operaes
adicionais antes ou depois do repasse

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Consequncias:

Mais flexvel que herana esttica (de implementao):

Responsabilidades podem ser adicionadas/removidas em


run-time simplesmente anexando/desanexando
decorators
Herana iria demandar uma nova classe para cada
responsabilidade adicional
Pode-se adicionar uma propriedade duas vezes (ex:
borda dupla). Herdaramos da classe que implementa a
borda duas vezes ?

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Consequncias:

Evita classes carregadas de funcionalidades no alto da


hierarquia:

O Decorator oferece uma abordagem pay-as-you-go


Ao invs de tentar suportar todas as funcionalidades
previstas em uma classe configurvel extremamente
complexa define-se uma classe simples e adiciona-se
funcionalidades de forma incremental, atravs de
objetos decorator
A aplicao no paga por funcionalidades que no utiliza
fcil definir novos decorators independente das classes
que eles estendem

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Consequncias:

O decorator e o seu componente no so idnticos:

Um decorator atua como um encapsulamento


transparente mas, sob um ponto de vista de identidade
de objeto, no igual ao seu componente
No deve-se depender da identidade de objetos quando
utilizando decorators

Grande quantidade de objetos pequenos:

Um projeto que usa o Decorator geralmente resulta em


um sistema formado por diversos objetos pequenos
parecidos, que diferem na forma com que foram
conectados
Pode ser difcil de compreender e depurar

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Implementao:

Conformidade de interface:

Portanto, decorators concretos devem herdar de uma


classe comum

Omitindo a classe abstrata Decorator:

A interface de um objeto decorator deve estar em


conformidade com a interface do componente que ele
decora

Pode-se omitir a classe abstrata do decorator quando


necessita-se adicionar apenas uma responsabilidade

Desempenho das classes componente:

A interface comum dos componentes e decorators deve


focar em servios, no em armazenamento de dados

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Cdigo exemplo:

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Cdigo exemplo:

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Cdigo exemplo:

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Cdigo exemplo:

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Usos conhecidos:

InterViews

ET++

Facilidades de I/O

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Decorator

Padres relacionados:

O Decorator diferente do Adapter no sentido que o


Decorator somente muda as responsabilidades do objeto e
no a sua interface. O Adapter d ao objeto uma interface
completamente diferente
Um Decorator pode ser visto como um Composite
degenerado com somente um componente. Entretanto, o
Decorator adiciona responsabilidades, no tem a inteno
de realizar agregaes
Um Decorator permite que voc troque a casca de um
objeto. Um Strategy permite que voc troque o
comportamento interno de um objeto
INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

INF011 Padres de Projeto


12 Decorator
Sandro Santos Andrade
sandroandrade@ifba.edu.br

Instituto Federal de Educao, Cincia e Tecnologia da Bahia


Departamento de Tecnologia Eletro-Eletrnica
Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas

INF011 Padres de Projeto Graduao Tecnolgica em Anlise e Desenvolvimento de Sistemas Sandro S. Andrade

Você também pode gostar