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