Decorator
Descrição:
A intenção do padrão de projeto Decorator é dinamicamente, agregar responsabilidades adicionais a um objeto. Os Decorators fornecem uma alternativa flexível ao uso de subclasses para extensão de funcionalidades.
Descrição da Diagrama de Classes genérico do padrão de projeto Decorator.
- - define a interface para objetos que podem ter responsabilidades acrescentadas aos mesmos dinamicamente.
- - define um objeto para o qual responsabilidades adicionais podem ser atribuídas.
- - mantém uma referência para um objeto Component e define uma interface que segue a interface de Component.
- - acrescenta responsabilidades ao componente.
Diagrama de Classes genérico do padrão:

Exemplo:
Beverage é uma classe abstrata com os dois métodos getDescription() e cost(). getDescription() já está implementado, mas é necessário implementar cost() nas subclasses.
Para implementar a classe abstrata Condiments (Decorator) é necessário intercambiar com a classe Beverage, por isso é estendido a classe Beverage.
Para implementar algumas bebidas é preciso definir uma descrição para a bebida especifica e também implentar o método cost().
- - primeiro se estende a classe beverage, já que se trata de uma bebida.
- - a descrição fica definida no construtor da classe, a variável de instância de descrição é herdada de Beverage.
- - para calcular o custo de um Espresso, não é mais necessário se preocupar com a adição de condimentos a essa classe, é preciso apenas retornar o preço do Espresso.
As outras classes HouseBlend, DarkRoast e Decaf podem ser implementadas exatamendo nesse padrão.
No diagrama de classe é possível ver o componente abstrato (Beverage), os componentes concretos (HouseBlend, DarkRoast, Decaf, Espresso) e o decorator abstrato (CondimentDecorator).
- - é importante lembrar que o CondimentDecorator estende Beverage. Mocha é um decorador, então é necessário estender CondimentDecorator
- - instâncias referentes a Beverage são criadas: (1) uma variável de instância para conter a bebida que está sendo englobada. (2) uma maneira de definir essa variável de instância para o objeto que está sendo englobado, é passar a bebida que está sendo englobada para o construtor do decorador.
- - na descrição é incluida a bebida - por exemplo, "DarkRoast" - e também é incluido cada item que decora a bebida, como "DarkRoast, Mocha". Assim, é delegado que o objeto está sendo decorado para obter a descrição, depois é anexado "Mocha" a essa descrição.
- - para colocar o custo da bebida com Mocha, primeiro é delegado a chamada para o objeto que está sendo decorado, para que ele possa calcular o custo, depois, é adicionado o custo de Mocha ao resultado.
Diagrama de Classes do exemplo:

