Composite. Pronunciação americana: compósit Pronunciação canadense (Britânica): cómposit

Documentos relacionados
INF011 Padrões de Projeto. 11 Composite

Composite. Padrões de Projeto. Composite. Prof. MSc Manfrine Santos. Anderson Fernandes Esteves. Manaus, Outubro de / 19

As classes Formatador e ElementosAFormatar

Programação Orientada a Objetos

Programação Orientada a Objetos. Padrões Estruturais

Collections Framework

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

Iteradores. Iteradores. Isabel Harb Manssour. Roteiro. Coleções

Palavras Reservadas da Linguagem Java

Orientação a Objetos AULA 09

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Linguagem de Programação II Implementação

Abstract Factory. Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas

Computação II Orientação a Objetos

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Prova 2 PMR2300 1o. semestre 2015 Prof. Thiago Martins

4 Conceito de Herança

Iterator. Professor: Hyggo Almeida

Análise e Projeto Orientados por Objetos

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

Visitor. Um problema a resolver. Temos uma hierarquia de classes, provavelmente um Composite Exemplo: Numa rede elétrica, temos a seguinte hierarquia:

Programação Orientada a Objetos

MODEL-VIEW-CONTROLER. Prof. Fellipe Aleixo

Coleções. João Paulo Q. dos Santos

Compiladores Análise Semântica

Aula 9 Herança. Prof. Jefersson Alex dos Santos

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Computação II Orientação a Objetos

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Compiladores Análise Semântica

Boas práticas com Orientação a Objetos. Paulo Silveira

Model-View-Controller (MVC)

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Computação II Orientação a Objetos

API e Coleções Java. Sérgio Luiz Ruivace Cerqueira

Structural Patterns - Composite

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Tópicos da Aula. POO e Padrões de Projetos. Considere três classes... Reuso de Classes. Locadora de DVD. Sistema Acadêmico

Hashing. ACH Introdução à Ciência da Computação II. Delano M. Beder

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Computação II Orientação a Objetos

Construtores e Especificadores de Acesso

LSD LSD PICC. Manuela Sousa

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

Prof. Fernando V. Paulovich 8 de novembro de SCC Programação Orientada a Objetos

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

EXPRESSÕES BOOLEANAS. Ex: boolean b = false; // declara uma variável do tipo boolean e atribui false

Lista de Exercícios da disciplina Aplicações de Linguagem de Programação Orientada a objetos

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

Computação II Orientação a Objetos

Programação II. Cassio Diego

Fundamentos da programação Parte - 1

Lista encadeada class No { Coleções. Enumeration. Lista encadeada (continuação) Enumeration Exemplo usando a classe Lista anterior

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA (ABORDAGEM RECURSIVA)

Java para Desktop. Programação Orientada à Objetos 2 JSE

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Instituto Federal de Educação, Ciência e Tecnologia da Bahia Campus Irecê Disciplina: Linguagem Técnica II Prof o Jonatas Bastos

Computação II Orientação a Objetos

O problema da herança múltipla e o uso de Interfaces. Herança múltipla. Interfaces. Definindo Interfaces 30/11/2016

Programação orientada a objetos em Java

Computação II Orientação a Objetos

Refinamento da Modelagem

Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação-IESTI CCO002 Engenharia de Software

Java 2 Standard Edition Classes internas

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Métodos Genéricos. Prof.: Michele Nasu Tomiyama Bucci

ESTRUTURAS DE DADOS E ALGORITMOS LISTA LIGADA

Linguagem de Programação III

Computação II Orientação a Objetos

Linguagem Java - Introdução

Elaborando as Interfaces Aulas 31, 32 e 33

9 Classes Abstractas e Interfaces

Atividade 08 - Utilizando Collections - List

Compiladores Análise de Tipos

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli

Objetos e Estilos de Interação

PROJETO DE DADOS PROJETO ARQUITETURAL BÁSICO. Projeto de Programas PPR0001

Classes e Objetos. Sintaxe de classe em Java

Organizam dados de forma hierárquica. Acontecem com frequência na natureza. Fáceis de representar e manipular com computadores

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Criando interfaces com o usuário. Continuação

Programação por Objectos. Java

Computação II Orientação a Objetos

Programação Orientada a Objetos SANTOS, Rafael

p Imagine que um Sistema de Controle do Banco pode ser acessado, além dos Gerentes, pelos Diretores do Banco

Programação com Objectos 2º Teste Tipo 1º Semestre (120 minutos)

Compiladores Análise Semântica

Linguagem de Programação I

Singleton e Adapter. Professor: Nazareno Andrade (baseado no material de Hyggo Almeida e Jacques Sauvé)

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Padrão de Projeto State

Programação Orientada a Objetos Relacionamentos entre classes

REST. Representational State Transfer. É um estilo arquitetural usado por muitas aplicações Web para estender as suas funcionalidades.

Transcrição:

Pronunciação Pronunciação americana: compósit Pronunciação canadense (Britânica): cómposit Um problema a resolver: editor de documentos Para introduzir este padrão (e alguns outros), usaremos o exemplo do projeto de um editor de documentos WYSIWYG (What You See Is What You Get) Semelhante a Word, por exemplo Outros exemplos do padrão no Swing de Java O editor pode misturar texto e gráficos usando várias opções de formatação A redor da área de edição estão os menus, scroll bars, barras de ferramentas, etc. O primeiro problema de design que queremos atacar é como representar a estrutura do documento Essa estrutura afeta o resto da aplicação já que a edição, formatação, análise textual, etc. deverão acessar a representação do documento Um documento é um arranjo de elementos gráficos básicos Caracteres, linhas, polígonos e outras figuras O usuário normalmente não pensa em termos desses elementos gráficos mas em termos de estruturas físicas Linhas, colunas, figuras, tabelas e outras subestruturas As subestruturas podem ser compostas de outras subestruturas, etc. O usuário também pode pensar na estrutura lógica Página 1 de 16

(frase, parágrafos, seções, etc.) Não vamos considerar isso aqui mas a solução que usaremos se aplica a esta situação também A interface do usuário (UI) do editor deve permitir que o usuário manipule tais subestruturas diretamente Por exemplo, o usuário pode tratar um diagrama como uma unidade em vez de uma coleção de elementos gráficos primitivos O usuário deve manipular uma tabela como uma unidade e não como um amontoado de texto e gráficos Para permitir tal manipulação, usaremos uma representação interna que case com a estrutura física do documento Portanto, a representação interna deve suportar: A manutenção da estrutura física do documento (o arranjo de texto e gráficos em linhas, colunas, tabelas,...) A geração e apresentação visual do documento Mapear posições da tela para elementos da representação interna. O editor vai saber para o que o usuário está apontando Tem algumas outras restrições no projeto Texto e gráficos devem ser tratados uniformemente A interface deve permitir embutir texto em gráficos e vice-versa Um gráfico não deve ser tratado como caso especial de texto, nem texto como caso especial de gráfico, senão teremos mecanismos redundantes de manipulação, formatação, etc. A implementação não deve ter que diferenciar entre elementos únicos e grupos de elementos na representação interna O editor deve tratar elementos simples e complexos de forma uniforme permitindo assim documentos arbitrariamente complexos O décimo elemento da linha 5, coluna 2 pode ser um caractere único ou um diagrama complexo Página 2 de 16

com muitos elementos Basta que o elemento saiba se desenhar, possa dar suas dimensões: ele pode ter qualquer complexidade Por outro lado, queremos analisar o texto para verificar a grafia, hifenizar, etc. e não podemos verificar a grafia de gráficos ou hifenizá-los Composição recursiva Uma forma comum de representar informação estruturada hierarquicamente é através da Composição Recursiva Permite construir elementos complexos a partir de elementos simples Aqui, a composição recursiva vai permitir compor um documento a partir de elementos gráficos simples Começamos formando linhas a partir de elementos gráficos simples (caracteres e gráficos) Múltiplas linhas formam colunas Múltiplas colunas formam páginas Múltiplas páginas formam documentos etc. Página 3 de 16

Podemos representar essa estrutura física usando um objeto para cada elemento Isso inclui elementos visíveis e elementos estruturais (linhas, colunas) A estrutura de objetos seria como abaixo Na prática, talvez um objeto não fosse usado para cada caractere por razões de eficiência Página 4 de 16

Podemos agora tratar texto e gráficos uniformemente Podemos ainda tratar elementos simples e compostos uniformemente Teremos que ter uma classe para cada tipo de objeto e essas classes terão que ter a mesma interface (para ter uniformidade de tratamento) Uma forma de ter interfaces compatíveis é de usar herança Definimos uma interface "ElementoDeDocumentoIF" e uma classe abstrata "ElementoDeDocumento" para todos os elementos que aparecem na estrutura de objetos Suas subclasses definem elementos gráficos primitivos (caracteres e gráficos) e elementos estruturais (linhas, colunas, frames, páginas, documentos,...) Parte da hierarquia de classes segue abaixo Página 5 de 16

Elementos de documentos têm três responsabilidades Sabem se desenhar (draw) Sabem o espaço que ocupam (limites) Conhecem seus filhos e pai Subclasses de ElementoDeDocumento devem redefinir certas operações tais como draw() Um ElementoDeDocumentoIF pai deve freqüentemente saber quanto espaço seus filhos ocupam para posicioná-los de forma a não haver sobreposição Página 6 de 16

Isso é feito com o método limites() que retorna o retângulo que contém o elemento A operação intersecta() serve para saber se um ponto intersecta o elemento Usado quando o usuário clica com o mouse A classe abstrata ElementoCompostoDeDocumento implementa certos métodos comuns através da aplicação sucessiva do método aos filhos É o caso de intersecta() Todos os elementos têm uma mesma interface para gerenciar os filhos (inserir, remover, etc.) Este padrão de projeto chama-se e será discutido mais detalhadamente agora O Padrão Objetivo Compor objetos em estruturas em árvore para representar hierarquias Parte-Todo permite que clientes tratem objetos individuais e composições uniformemente Participantes Os nomes genéricos dados às classes abstratas são Component e Os nomes genéricos dados às classes concretas são Leaf e Concrete Página 7 de 16

Conseqüências do uso de Objetos complexos podem ser compostos de objetos mais simples recursivamente O cliente pode tratar objetos simples ou compostos da mesma forma: simplifica o cliente Página 8 de 16

Facilita a adição de novos componentes: o cliente não tem que mudar com a adição de novos objetos (simples ou compostos) Exemplo: no editor, como adicionar "Comentários" do tipo Word? O que pode estar contido num comentário? Do lado negativo, o projeto fica geral demais É mais difícil restringir os componentes de um objeto composto Por exemplo, acima, podemos compor linhas com linhas ou com documentos, etc. o que não faz sentido O sistema de tipagem da linguagem não ajuda a detectar composições erradas A solução é verificar em tempo de execução Considerações de implementação Adicionar referência ao pai de um objeto pode simplificar o caminhamento na estrutura Onde adicionar a referência ao pai? Normalmente é colocada na classe abstrata Component Exercício: colocar esta referência na figura acima As subclasses herdam a referência e os métodos que a gerenciam Compartilhamento de componentes Útil para reduzir as necessidades de espaço Por exemplo, caracteres iguais poderiam compartilhar objetos Fazer isso complica se os componentes só puderem ter um único pai O padrão "flyweight" mostra como resolver a questão Maximização da interface de Component Exercício para casa: certos livros colocam os métodos de gerenciamento de filhos apenas na classe porque uma folha não tem filhos! Página 9 de 16

Você concorda ou discorda com a maximização da interface de Component? Por quê? Em outras palavras, é melhor ter uma interface idêntica para folhas e (transparência para o cliente) ou interfaces diferentes (segurança de não fazer besteiras como adicionar um filho a uma folha, o que seria capturado pelo compilador)? Se mantivermos as interfaces de Component e diferentes, como o cliente pode testar se um objeto é folha ou composto? Onde são armazenados os filhos? Nós os colocamos em mas eles poderiam ser colocados em Component A desvantagem é a perda de espaço para essa referência para folhas Quando os filhos devem ter uma ordem especial, deve-se cuidar deste aspecto Usar um iterator é uma boa idéia Cache de informação As classes podem manter em cache informação sobre seus filhos de forma a eliminar (curto-circuitar) o caminhamento ou pesquisa nos filhos Um exemplo: um poderia manter em cache os limites do conjunto de filhos de forma a não ter que recalcular isso sempre Quando um filho muda, a cache deve ser invalidada Neste caso, os filhos devem conhecer o pai para avisar da mudança Como armazenar os filhos? ArrayList, LinkedList, HashMap (qualquer coleção razoável) Uso do padrão na API Java: O pacote java.awt.swing Usa o padrão com a classe abstrata Página 10 de 16

"Component" e o sendo a classe "Container" Folhas podem ser Label, TextField, Button s concretos são Panel, Frame, Dialog Exemplo de código: um editor de documentos O diagrama de classes segue Página 11 de 16

interface ElementoDeDocumentoIF { ElementoDeDocumentoIF getpai(); * Retorna o font associado a este objeto. * Se não houver font, retorna o font do pai. * Se não houver pai, retorna null. Font getfont(); * Associa um font a este objeto. void setfont(font font); * Retorna o número de glyphs que este objeto contém. int getnumglyph(); * Retorna o filho deste objeto na posição dada. ElementoDeDocumentoIF getfilho(int índice) throws ÉFolhaException; * Faça o ElementoDeDocumentoIF dado um filho deste obje void inserefilho(elementodedocumentoif filho) throws ÉFolhaException; * remove o ElementoDeDocumentoIF dado * da lista de filhos deste objeto. void removefilho(elementodedocumentoif filho) throws ÉFolhaException; } // interface ElementoDeDocumentoIF abstract Class ElementoDeDocumento implements ElementoDeDocumentoIF { // Este é o font associado ao objeto // Se for nulo, o font é herdado do pai private Font font; // o container deste objeto Página 12 de 16

ElementoDeDocumentoIF pai;... public ElementoDeDocumentoIF getpai() { return pai; } public Font getfont() { if(font!= null) { return font; } else if(pai!= null) { return pai.getfont(); } else { return null; } } // getfont() public void setfont(font font) { this.font = font; } // setfont() public abstract int getnumglyph(); public ElementoDeDocumentoIF getfilho(int índice) throws ÉFolhaException { throw new ÉFolhaException("Folha não tem filhos"); } * Faça o ElementoDeDocumentoIF dado * um filho deste objeto. public void inserefilho(elementodedocumentoif filho) throws ÉFolhaException { throw new ÉFolhaException("Folha não tem filhos"); } * Remove o ElementoDeDocumentoIF dado * da lista de filhos deste objeto. public void removefilho(elementodedocumentoif filho) { throws ÉFolhaException { throw new ÉFolhaException("Folha não tem filhos"); } } // class ElementoDeDocumento abstract class ElementoCompostoDeDocumento extends ElementoDeDocumento Página 13 de 16

implements ElementoDeDocumentoIF { // Os filhos deste objeto private Collection filhos = new Vector(); // Valor em cache de getnumglyph private int cachenumglyph; // Validade de cachenumglyph private boolean cachevalida = false; * Retorna o filho deste objeto na posição dada. public ElementoDeDocumentoIF getfilho(int índice) { return (ElementoDeDocumentoIF)filhos.get(índice); } // getfilho() * Faça o ElementoDeDocumentoIF dado * um filho deste objeto. public synchronized void inserefilho(elementodedocumento synchronized(filho) { filhos.add(filho); filho.pai = this; estruturamudada(); } // synchronized } // inserefilho() * Remove o ElementoDeDocumentoIF dado * da lista de filhos deste objeto. public synchronized void removefilho(elementodedocumento synchronized(filho) { if(this == filho.pai) { filho.pai = null; filhos.remove(filho); estruturamudada(); } } // synchronized } // removefilho()... * Uma chamada a esta função significa que um filho mudo * o que invalida a cache de informação que o objeto man * sobre seus filhos. public void estruturamudada() { Página 14 de 16

cachevalida = false; if(pai!= null) { pai.estruturamudada(); } } // estruturamudada() * Retorna o número de glyphs que este objeto contém. public int getnumglyph() { if(cachevalida) { return cachenumglyph; } cachenumglyph = 0; for(int i = 0; i < filhos.size(); i++) { cachenumglyph += ((ElementoDeDocumentoIF)filhos. } // for cachevalida = true; return cachenumglyph; } // getnumglyph() } // class ElementoCompostoDeDocumento class Caractere extends ElementoDeDocumento implements ElementoDeDocumentoIF {... * Retorna o número de glyphs que este objeto contém. public int getnumglyph() { return 1; } // getnumglyph() } // class Caractere class Imagem extends ElementoDeDocumento implements ElementoDeDocumentoIF {... * Retorna o número de glyphs que este objeto contém. public int getnumglyph() { return 1; } // getnumglyph() } // class Imagem class Página extends ElementoCompostoDeDocumento { implements ElementoDeDocumentoIF {... Página 15 de 16

} // Página Alguns comentários getfont() usa a informação de seu pai Um objeto composto usa uma cache para saber quantos glyphs compõem o objeto synchronized é usado ao mexer com dados que podem ser compartilhados para possibilitar uma implementação multi-threaded Perguntas finais para discussão Você usaria o padrão se não tivesse uma hierarquia parte-todo? Em outras palavras, se apenas alguns objetos têm filhos e quase todos os outros objetos de uma coleção são folhas (uma folha não tem filho), você ainda usaria o padrão para modelar tais objetos? Referências adicionais A look at the design pattern programa Página 16 de 16