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
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 e Iterator
2
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
ZipInputStream
Decorator e Iterator
BufferedInputStream
3
Decorator
Usando herança
FileInputStream
ZipInputStream
ZipBufferedInputStream
Decorator e Iterator
BufferedInputStream
Poluição da hierarquia!!!
4
Decorator
Alternativa: delegação!!!

Decorando o comportamento de cada Stream
FileInputStream
Cliente
Cliente
Cliente
Decorator e Iterator
BufferedInputStream
ZipInputStream
BufferedInputStream
FileInputStream
FileInputStream
5
Decorator
Estrutura
<<abstract>>
1
InputStream
FileInputStream
FilterInputStream
BufferedInputStream
Decorator e Iterator
1
ZipInputStream
6
Decorator
Código com buffer (muda apenas uma linha)
BufferedInputStream arq =
new BufferedInputStream(new FileInputStream("c:/a.txt"));
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
Decorator e Iterator
7
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
Decorator e Iterator
8
Decorator
Conseqüências

maior flexibilidade do que a herança estática

evita superclasses sobrecarregadas de características

grande quantidade de pequenos objetos
Decorator e Iterator
9
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...
DataInputStream d =
new DataInputStream(
new DedoDuroInputStream(
new BufferedInputStream(
new FileInputStream("c:/teste.txt")
)
)
);
Decorator e Iterator
11
Importante:
Tenha certeza que você entendeu a diferença do
Adapter para o Decorator!
Composite
Considere o projeto de um editor de documentos
Quais entidades estariam presentes na modelagem do
documento???
Coluna
Nota
Figura
Página
Comentário
Documento
Caracter
Composite
Linha
Tabela
13
Composite
Agora vamos relacioná-las...
Documento
* Página
*
Coluna
*
Linha
Nota
Composite
Caracter
Figura
Tabela
14
Composite
Problemas??? Muitos... olha só o Word!!!
você
E Sabia
claro...que
Texto
na pode
inserir
Nota.Texto em
Figura?
Nota
Em uma tabela...
pode-se adicionar
Figura, Coluna, ...
* Página
Documento
*
Spaghetti
Coluna
CAOS
E acreditem!!! Quase
Software em Crise!!!
Quasetudo
tudopode
podeser
ser
*
colocado
dentro de um
comentado!!!
Linha
comentário!!!
Caracter
Figura
Tabela
Comentário
Composite
15
Composite
Solução – Composite
Intenção

Composite
compor objetos em estruturas de árvores
para representarem hierarquias partestodo. Permite aos clientes tratarem de
maneira uniforme objetos individuais e
composição de objetos.
16
Composite
Aplicabilidade


Composite
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
17
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
Composite
18
Composite
Documento
* Página
*
<<interface>>
Desenhavel
NaoComposto
Caracter
Composto
Coluna
Nota
Linha
Tabela
Não é composto
Figura
É composto
Composite
19
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
Composite
20
Padrões semelhantes
Decorator usa composição para estender
funcionalidade
Façade usa composição para esconder
complexidade
Dúvidas?
?
Decorator e Iterator
23
Download

12.DecoratorEComposite