técnicas de programação avançada - uffanselmo/cursos/tpa/apresentacoes/padraodecorator.pdf ·...

40
Técnicas de Programação Avançada TCC-00.174 Prof.: Anselmo Montenegro www.ic.uff.br/~anselmo [email protected] Conteúdo : Padrão Decorator Documento baseado no material preparado pelo Prof. Luiz André (http://www.ic.uff.br/~lapaesleme/)

Upload: dokien

Post on 12-Feb-2019

231 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Técnicas de Programação Avançada

TCC-00.174 Prof.: Anselmo Montenegro

www.ic.uff.br/~anselmo [email protected]

Conteúdo: Padrão Decorator

Documento baseado no material preparado pelo Prof. Luiz André (http://www.ic.uff.br/~lapaesleme/)

Page 2: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 2

O Padrão Decorator Padrões de Projeto

Será que herança resolver todos os problemas? Como evitar uma explosão de subclasses? É possível adicionar responsabilidades aos objetos sem introduzir mudanças nas classes base?

Page 3: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 3

Problema exemplo Padrões de Projeto

Considere uma cafeteria que possui alguns produtos em seu menu de pedidos Inicialmente, havia poucos produtos básicos e o sistema previa somente as classes abaixo

Page 4: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 4

Problema exemplo Padrões de Projeto

Por outro lado, a cafeteria oferecia aos clientes a possibilidade de adicionar complementos (leite, chocolate, soja, etc..), que obviamente são cobrados... Então para manter todas essas possibilidades de combinação temos uma verdadeira explosão de classes

Page 5: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 5

Uma explosão de classes Padrões de Projeto

Page 6: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 6

Primeira Solução Padrões de Projeto

Vamos eliminar todas essas classes Vamos criar variáveis de instância que indicam para cada instância de bebida, que tipo de complementos ela possui

Page 7: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 7

Problema exemplo Padrões de Projeto

Primeira solução: Vamos acabar com todas essas classes Vamos criar variáveis de instância que indicam para cada instância de bebida, que tipo de complementos ela possui

Page 8: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 8

Problema exemplo Padrões de Projeto

Primeira solução: Vamos acabar com todas essas classes Vamos criar variáveis de instância que indicam para cada instância de bebida, que tipo de complementos ela possui

Page 9: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 9

Primeira Solução Padrões de Projeto

Page 10: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 10

Problema exemplo Padrões de Projeto

Problemas?

Page 11: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 11

Problema exemplo Padrões de Projeto

Mudança de preços dos complementos forçarão a mudar o código existente Novos complementos nos forçarão a adicionar novos métodos e alterar o método cost() na superclasse Para novas bebidas alguns complementos podem não fazer sentido nenhum (Já vimos isso acontecer no exemplo do Padrão Strategy) O que fazer para contemplar bebidas com complementos duplos? Café com mocha dupla???

Page 12: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 12

Uso de princípios Padrões de Projeto

Quarto princípio de projeto:

Classes devem ser fechadas para modificação e abertas para extensão.

Page 13: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 13

Observação sobre o princípio aberto/fechado

O uso excessivo do princípio fechado para modificação e

aberto pra extensão pode levar a um código excessivamente

abstrato e complexo

O princípio deve ser utilizado apenas em pontos do código

em que mudanças são improváveis

Page 14: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 14

Uso de princípios Padrões de Projeto

Objetivo: permitir que classes sejam estendidas para incorporar novos comportamentos sem modificar o código existente Qual o resultado?

Os projetos se tornam resilientes a mudanças e flexíveis o suficiente para adquirir novas funcionalidades que satisfazem os requisitos

Page 15: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 15

Metáfora da decoração Padrões de Projeto

Como vamos resolver o problema? Resposta: vamos usar uma metáfora de decoração

Page 16: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 16

Padrão Decorator Padrões de Projeto

Exemplo:

Pegar um objeto DarkRoast Decorá-lo com um objeto Mocha Decorá-lo com um objeto Whip

Chamar o método cost() e lançar mão de delegação para adicionar o

custo dos complementos

Page 17: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 17

Metáfora da decoração Padrões de Projeto

Que tipo de relacionamento dever ser estabelecido entre os objetos quando pensamos na ação decorar? Como implementar a noção de decoração? Como delegar as responsabilidade de adicionar os custos para a classe decorada?

Page 18: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 18

Metáfora da decoração Padrões de Projeto

Vamos usar a noção de objeto wrapper (empacotador)

Whip

Mocha

DarkRost

• cost()

• cost()

• cost()

Page 19: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 19

Metáfora da decoração Padrões de Projeto

Whip

Mocha

DarkRost

• cost()

• cost()

• cost()

whip.cost()

0.99

1.10

1.29

Page 20: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 20

Segunda Solução Padrões de Projeto

Page 21: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 21

Padrão Decorator Padrões de Projeto

O Padrão Decorator anexa responsabilidades adicionais a um objeto dinâmicamente. Além disso, provê uma alternativa flexivel a subclasses para extensão de funcionalidades.

Page 22: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 22

Padrão Decorator - características Padrões de Projeto

Decorators tem o mesmo supertipo que os objetos decorados É possível usar mais de um decorador para empacotar um objeto Com o Padrão Decorator é possível manipular o objeto decorado no lugar do original pois eles tem o mesmo tipo O decorador adiciona seu próprio comportamento antes ou depois de delegar o resto da tarefa para o objeto Objetos podem ser decorados dinamicamente

Page 23: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 23

Usos do Padrão Decorator

Utilização

Quando se desejar adicionar responsabilidades a objetos individuais e não a uma classe inteira Quando se desejar retirar responsabilidades Quando extensões por subclasses for impraticável devido à grande quantidade de classes

Page 24: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 24

Usos do Padrão Decorator

Utilização

Quando se desejar adicionar responsabilidades a objetos individuais e não a uma classe inteira Quando se desejar retirar responsabilidades Quando extensões por subclasses for impraticável devido à grande quantidade de classes

Page 25: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 25

Usos do Padrão Decorator

Participantes

Componente – define a interface para objetos que podem ter funcionalidades adicionadas dinamicamente. Componente concreto – define a implementação da interface do componente Decorador – mantém uma referência para um componente concreto e segue a interface do componente Decorador concreto – define a implementação do decorador

Page 26: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 26

Desvantagens do padrão decorator

Leva a criação de um número muito grande de objetos pequenos semelhantes, o que pode tornar a manutenção complicada Os Decoradores e os objetos encapsulados não são idênticos o que pode levar a falha de testes dependentes de instanceOf.

Page 27: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 27

Usos do Padrão Decorator

Page 28: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 28

Solução com o Padrão Decorator

public abstract class Beverage { String description = “Unknown Beverage”; public String getDescription() { return description; } public abstract double cost(); }

public abstract class CondimentDecorator extends Beverage { public abstract String getDescription(); }

public class Espresso extends Beverage { public Espresso() { description = “Espresso”; } public double cost() { return 1.99; } }

public class HouseBlend extends Beverage{ public HouseBlend() description = “House Blend Coffee”; } public double cost() { return .89; } }

Page 29: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 29

Solução com o Padrão Decorator

public class Mocha extends CondimentDecorator { Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + “, Mocha”; } public double cost() { return .20 + beverage.cost(); } }

public class SteamedMilk extends CondimentDecorator { Beverage beverage; public SteamedMilk(Beverage beverage) { this.beverage = beverage; } public String getDescription() { return beverage.getDescription() + “, SteamedMilk”; } public double cost() { return .10 + beverage.cost(); } }

Page 30: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 30

Solução com o Padrão Decorator Padrões de Projeto

Algum problema?

Page 31: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 31

Solução com o Padrão Decorator

public class StarbuzzCoffee { public static void main(String args[]) { Beverage beverage = new Espresso(); System.out.println(beverage.getDescription()+ “ $” + beverage.cost()); Beverage beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2); beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); System.out.println(beverage2.getDescription() + “ $” + beverage2.cost()); Beverage beverage3 = new HouseBlend(); beverage3 = new Soy(beverage3); beverage3 = new Mocha(beverage3); beverage3 = new Whip(beverage3); System.out.println(beverage3.getDescription() + “ $” + beverage3.cost()); } }

Page 32: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 32

Exemplo de Padrão Decorator no Java

LineNumberInputStream

BufferedInputStream

FileInputStream

•LineNumberInputStream também é um decorador concreto que adiciona a funcionalidade de contar o número de linhas na medida em que os dados são lidos

•BufferedInputStream é um decorador concreto. BufferedInputStream adiciona basicamente dois comportamentos: melhora a performance através de um buffer para os dados de entrada, além de adicionar o método readLine() à interface para leitura de dados de entrada por caracteres, uma linha por vez.

•FileInputStream é o component decorado. A Java I/O library disponibiliza vários componentes, incluindo FileInputStream, StringBufferInputStream, ByteArrayInputStream e outros.

Cada um fornece um componente base para ler bytes.

Page 33: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 33

Exercício I

Considere o problema da cafeteria e a solução proposta através de decoradores. Adapte a solução para que descontos sejam dados sobre os complementos a partir do segundo complemento. O segundo complemento deve ter um desconto de 25%, o terceiro 40% e os demais complementos 50%.

Page 34: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 34

Exercício II

Escreva um método que imprima o nome do produto vendido de modo que complementos idênticos apareçam sequencialmente no tipo do produto vendido.

Page 35: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 35

Exercício III

Escreva um decorador que converta todos os caracteres em maiúsculas para minúsculas no input stream.

Page 36: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 36

Solução do Exercício

public class LowerCaseInputStream extends FilterInputStream { public LowerCaseInputStream(InputStream in) { super(in); } public int read() throws IOException { int c = super.read(); return (c == -1 ? c : Character.toLowerCase((char)c)); } public int read(byte[] b, int offset, int len) throws IOException { int result = super.read(b, offset, len); for (int i = offset; i < offset+result; i++) { b[i] = (byte)Character.toLowerCase((char)b[i]); } return result; }

Page 37: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 37

Solução do Exercício

public class InputTest { public static void main(String[] args) throws IOException { int c; try { InputStream in = new LowerCaseInputStream( new BufferedInputStream( new FileInputStream(“test.txt”))); while((c = in.read()) >= 0) { System.out.print((char)c); } in.close(); } catch (IOException e) { e.printStackTrace(); } } }

Page 38: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 38

Exercício IV

Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem um conteúdo na forma de uma cadeia de caracteres. Suponha que o e-mail tenha que possuir novas características: primeiro, o e-mail deve ter um descritor da companhia adicionado ao final do conteúdo original; segundo, o e-mail deve permitir o uso de mensagens criptografadas. Proponha uma solução em que os diferentes tipos de e-mail possam ser utilizados em um sistema cliente.

Page 39: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

Padrões de Projeto

05/02/2013 Técnicas de Programação Avançada 39

Exercício

Referência para o exercício anterior: http://java.dzone.com/articles/design-patterns-decorator

Page 40: Técnicas de Programação Avançada - UFFanselmo/cursos/TPA/apresentacoes/PadraoDecorator.pdf · Escreva uma classe que implemente um objeto que descreva um e-mail. Um e-mail tem

05/02/2013 Técnicas de Programação Avançada 40

Padrões de Projeto Bibliografia

• Use a Cabeça ! Padrões de Projetos (design Patterns) - 2ª Ed. Elisabeth Freeman e Eric Freeman. Editora: Alta Books

• Padroes de Projeto – Soluções reutilizáveis de software orientado a objetos. Erich Gamma, Richard Helm, Ralph Johnson. Editora Bookman

• http://java.dzone.com/articles/design-patterns-decorator. Último acesso em 05/02/2013 - 20:49