23
Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Embed Size (px)

Citation preview

Page 1: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator e CompositeNazareno Andrade

(baseado no material de Hyggo Almeida)

Page 2: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

Vocês sabem como ler um arquivo texto em Java???

Pode-se usar a classe java.io.FileInputStream

Vamos fazer um teste

2Decorator e Iterator

public class Leitor { public static void main(String[] args) throws Throwable{ FileInputStream arq = new FileInputStream("c:/a.txt"); byte[] conteudoEmBytes = new byte[arq.available()]; arq.read(conteudoEmBytes); arq.close(); System.out.println(new String(conteudoEmBytes)); }}

Page 3: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

A classe FileInputStream porém, não utiliza bufferização...

Como utilizar um buffer para armazenar os caracteres durante a leitura?

E se quisermos também ter a opção de ler dados compactados com zip? Criar uma subclasse de FileInputStream??? Pode ser... mas vamos poluir a hierarquia quando adicionarmos

novos comportamentos

3Decorator e Iterator

ZipInputStream BufferedInputStream

Page 4: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

Usando herança

4Decorator e Iterator

ZipInputStream BufferedInputStream

FileInputStream

ZipBufferedInputStreamPoluição da hierarquia!!!

Page 5: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

Alternativa: delegação!!! Decorando o comportamento de cada Stream

5Decorator e Iterator

Cliente FileInputStream

Cliente BufferedInputStream FileInputStream

Cliente ZipInputStream FileInputStreamBufferedInputStream

Page 6: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

Estrutura

6Decorator e Iterator

<<abstract>>

InputStream

FileInputStream FilterInputStream1

1

BufferedInputStream ZipInputStream

Page 7: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

Código com buffer (muda apenas uma linha)

BufferedInputStream contém um FileInputStream

Quando a requisição de leitura é feita... BufferedInputStream “decora” a leitura armazenando caracteres no buffer...

... e delega o read() para FileInputStream

7Decorator e Iterator

BufferedInputStream arq = new BufferedInputStream(new

FileInputStream("c:/a.txt"));

Page 8: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

Intenção agregar responsabilidades adicionais a um objeto dinamicamente.

Fornece uma alternativa flexível ao uso de subclasses para extensão de funcionalidades.

Aplicabilidade para acrescentar responsabilidades a objetos individuais sem

afetar outros objetos para responsabilidades que podem ser opcionais quando a extensão através de subclasses é impraticável devido

ao estouro na quantidade de subclasses

8Decorator e Iterator

Page 9: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

Conseqüências maior flexibilidade do que a herança estática evita superclasses sobrecarregadas de características grande quantidade de pequenos objetos

9Decorator e Iterator

Page 10: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)
Page 11: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Decorator

Vamos Implementar a leitura do arquivo usando BufferedInputStream

Criando um novo tipo de decorador para InputStream chamado DedoDuroStream Sempre que a stream do arquivo é lida, imprime-se o dado lido. Crie um leitor de stream com “dedo duro”, bufferizado, com

suporte à leitura de dados String, boolean, etc...

11Decorator e Iterator

DataInputStream d = new DataInputStream(

new DedoDuroInputStream(new BufferedInputStream(

new FileInputStream("c:/teste.txt"))

));

Page 12: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Importante:

Tenha certeza que você entendeu a diferença do Adapter para o Decorator!

Page 13: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

13Composite

Composite

Considere o projeto de um editor de documentos

Quais entidades estariam presentes na modelagem do documento???

Página

Documento

Figura

Comentário

Nota

Linha

Coluna

TabelaCaracter

Page 14: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

14Composite

Composite

Agora vamos relacioná-las...

PáginaDocumento

Figura

Linha

Coluna

*

*

*

TabelaCaracterNota

Page 15: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

15Composite

CompositeProblemas??? Muitos... olha só o Word!!!

Em uma tabela... pode-se adicionar Figura, Coluna, ...

Comentário

Quase tudo pode ser comentado!!!

E acreditem!!! Quase tudo pode ser

colocado dentro de um comentário!!!

PáginaDocumento

Figura

Linha

Coluna

*

*

*

TabelaCaracterNota

Sabia que você pode inserir Texto em

Figura?

E claro... Texto na Nota.

SpaghettiCAOS

Software em Crise!!!

Page 16: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

16Composite

Composite

Solução – Composite

Intenção compor objetos em estruturas de árvores

para representarem hierarquias partes-todo. Permite aos clientes tratarem de maneira uniforme objetos individuais e composição de objetos.

Page 17: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

17Composite

Composite

Aplicabilidade para representar hierarquias parte-todo de

objetos os clientes devem ser capazes de ignorar a

diferença entre composições de objetos e objetos individuais

Page 18: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

18Composite

Composite

Solução Definir estruturas que podem ser compostas Definir estruturas que não podem ser

compostas Definir uma interface única Fazer composição recursiva

Page 19: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

19Composite

CompositePáginaDocumento

Figura

Linha

Coluna

*

*

Tabela

Caracter Nota

<<interface>>

Desenhavel

CompostoNaoComposto

Não é composto

É composto

Page 20: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

20Composite

Composite

Conseqüências define hierarquias de classes que consistem de

objetos primitivos e objetos compostos torna o cliente simples, tratando uniformemente as

estruturas primitivas e compostas torna mais fácil o acréscimo de novos componentes

primitivos ou compostos pode tornar o projeto genérico demais

Page 21: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)
Page 22: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Padrões semelhantes

Decorator usa composição para estender funcionalidade

Façade usa composição para esconder complexidade

Page 23: Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)

Dúvidas?

?23Decorator e Iterator