Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)
Transcript of Decorator e Composite Nazareno Andrade (baseado no material de Hyggo Almeida)
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