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 BufferedInputStream Decorator e Iterator 3
Decorator Usando herança FileInputStream ZipInputStream BufferedInputStream ZipBufferedInputStream Poluição da hierarquia!!! Decorator e Iterator 4
Decorator Alternativa: delegação!!! Decorando o comportamento de cada Stream Cliente FileInputStream Cliente BufferedInputStream FileInputStream Cliente ZipInputStream BufferedInputStream FileInputStream Decorator e Iterator 5
Decorator Estrutura <<abstract>> InputStream 1 FileInputStream FilterInputStream 1 BufferedInputStream ZipInputStream Decorator e Iterator 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??? Página Figura Nota Coluna Documento Comentário Linha Caracter Tabela Composite 13
Composite Agora vamos relacioná-las... Documento * Página * Coluna * Linha Nota Caracter Figura Tabela Composite 14
Composite Problemas??? Muitos... olha só o Word!!! Documento E Sabia claro... que Texto você na pode inserir Nota. Texto em Figura? * Página * Em uma tabela... pode-se adicionar Figura, Coluna,... Coluna Spaghetti CAOS E acreditem!!! Quase Software em Crise!!! Quase tudo tudo pode ser ser * colocado comentado!!! dentro de um Linha comentário!!! Nota Caracter Figura Tabela Comentário Composite 15
Composite Solução Composite Intenção compor objetos em estruturas de árvores para representarem hierarquias partestodo. Permite aos clientes tratarem de maneira uniforme objetos individuais e composição de objetos. Composite 16
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 Composite 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 Composto Caracter Coluna Nota Não é composto Linha Figura Tabela É 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 22