You are on page 1of 22

Decorator

EQUIPE: CARLOS EDUARDO FERNANDO FERREIRA LUIZ LOPES

Propsito

Dinamicamente , agregar responsabilidade adicionais a um objeto. Os decorators fornecem uma alternativa flexvel ao uso de subclasses para extenso de funcionalidades.

Aplicabilidade

Para acrescentar responsabilidades a objetos individuais de forma dinmica e transparente, ou seja, sem afetar outros objetos.

Para responsabilidade que podem ser removidas.


Quando a extenso atravs de subclasses no prtica.

Motivao

Objeto usado possui as funcionalidades bsicas, mas necessrio adicionar funcionalidades adicionais a ele que podem ocorrer antes ou depois da funcionalidade bsica. Funcionalidades devem ser adicionadas em instancias individuais e no na classe.

Problema

Imagine que voc est desenvolvendo um sistema para um bar especializado em coquetis, onde existem vrios tipos de coquetis que devem ser cadastrados para controlar a venda. Os coquetis so feitos da combinao de uma bebida base e vrios outros adicionais que compe a bebida. Por exemplo:

Problema
Conjunto de bebidas:
Cachaa
Rum Vodka Tequila

Conjunto de adicionais:
Limo
Refrigerante Suco Leite Gelo

condensado

Acar

Problema
Ento, como possveis coquetis temos:
Vodka Tequila

+ Suco + Gelo + Acar + Limo + Sal + Leite Condensado + Acar + Gelo

Cachaa

Problema

No entanto, como a especialidade do bar so coquetis, o cliente pode escolher montar seu prprio coquetel com os adicionais que ele quiser. De acordo com nosso modelo teramos ento que criar vrias classes para prever o que um possvel cliente solicitaria! Imagine agora a quantidade de combinaes possveis? Veja o diagrama UML abaixo para visualizar o tamanho do problema:

Possvel Soluo

10

Problema

Alm disso, pode ser que o cliente deseje adicionar doses extras de determinados adicionais, desse modo no seria possvel modelar o sistema para prever todas as possibilidades! Ento, como resolver o problema?

11

Soluo

Queremos que, dado um objeto Coquetel, seja possvel adicionar funcionalidades a ele, e somente a ele, em tempo de execuo. Vamos ver a arquitetura sugerida pelo padro:

12

Soluo

13

Participantes

Component Define a interface para objetos que podem ter responsabilidades acrescentadas aos mesmos dinamicamente. ConcreteCompnent Define um objeto para o qual responsabilidades adicionais podem ser atribudas.

Decorator Mantem uma referncia para um objeto Component e define uma interface que segue a interface de Component.
ConcreteDecoretor Acrescenta responsabilidades ao componente.

14

Estrutura

15

Consequncias

Mais flexibilidade do que herana


o

Adio ou remoo de responsabilidades em tempo de execuo

Adio da mesma propriedade mais de uma vez

Evita o excesso de funcionalidades nas classes Decorator e seu componente no so idnticos


o

Comparaes tornam-se mais complexas

Resulta em um design que tem vrios pequenos objetos, todos parecidos

16

Exemplo 1

Vamos aplicar o padro decorator na construo de pizzas, considerando que todas as pizzas tero massa, e os demais itens (Mussarela, Molho de Tomate, etc.) sero adicionados dinamicamente. Todos os itens tero mtodos para retornar a sua descrio e valor.

17

18

Exemplo 2

Resolvendo o problema dos Coquetis.

19

Exemplo 2

Diagrama.

20

Exemplo 3

Considere um sistema bancrio que precisa enviar mensagens aos seus clientes. Por exemplo, aps a realizao de uma compra com carto de crdito, uma mensagem contendo informaes sobre a compra pode ser enviada ao cliente e para sua segurana a mensagem pode ser criptografada ou comprimida.

21

22

You might also like