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

Preview:

Citation preview

Decorator e CompositeNazareno 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)); }}

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

Decorator

Usando herança

4Decorator e Iterator

ZipInputStream BufferedInputStream

FileInputStream

ZipBufferedInputStreamPoluição da hierarquia!!!

Decorator

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

5Decorator e Iterator

Cliente FileInputStream

Cliente BufferedInputStream FileInputStream

Cliente ZipInputStream FileInputStreamBufferedInputStream

Decorator

Estrutura

6Decorator e Iterator

<<abstract>>

InputStream

FileInputStream FilterInputStream1

1

BufferedInputStream ZipInputStream

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"));

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

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

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"))

));

Importante:

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

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

14Composite

Composite

Agora vamos relacioná-las...

PáginaDocumento

Figura

Linha

Coluna

*

*

*

TabelaCaracterNota

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!!!

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.

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

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

19Composite

CompositePáginaDocumento

Figura

Linha

Coluna

*

*

Tabela

Caracter Nota

<<interface>>

Desenhavel

CompostoNaoComposto

Não é composto

É composto

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

Padrões semelhantes

Decorator usa composição para estender funcionalidade

Façade usa composição para esconder complexidade

Dúvidas?

?23Decorator e Iterator

Recommended