Design Patterns – Composite e Visitor

Slides:



Advertisements
Apresentações semelhantes
ADT – Arvore Binária de Pesquisa
Advertisements

Projeto de Sistemas de Software Luana Lachtermacher
Listas Encadeadas Circulares Listas Duplamente Encadeadas
Listas Encadeadas Circulares Listas Duplamente Encadeadas
Espalhamento.
2008 LCG/UFRJ. All rights reserved. 1 Standard Template Library STL Claudio Esperança Paulo Roma Cavalcanti.
1 Estruturas de Controle Márcia J. N. Rodrigues Lucena Especialização em Técnicas e Ferramentas de Apoio à Decisão Departamento.
Técnicas e Projeto de Sistemas André Mesquita Rincon Processo de Software Técnico Subsequente – Módulo III.
Banco de Dados Aula 01: Conceitos Básicos
Técnicas e Projeto de Sistemas
Transporte em Nanoestruturas. I) Transporte balístico Um material unidimensional (confinado em duas dimensões) transporta carga quando uma voltagem é
PGF5001 – Mecânica Quântica 1 Prof. Emerson Passos.
Prof. Celso Gramática.
Prof. Celso Gramática.
FORTRAN 90 Denise Yumi Takamura.
INTRODUÇÃO À COMPUTAÇÃO PARALELA
Estruturas de Dados para projeto de SGBD. Estruturas de dados analisadas Estruturas de nível Esparso Denso Combinadas Arvore B+ Tabela de hash.
Container Managed Persistent Bean Kellyton Brito Projeto Compose
Teste Estrutural de Software
Criptografia Quântica : Um Estudo
Slide 1 Rede Nacional de Ensino e Pesquisa Treinamento em Gradep - junho 2005 Serviço Collector Treinamento no GRADEp Serviço Collector CollectorDemo e.
Servidores e Programação Web Redes de Computadores.
Técnicas de Processamento Imagens
Introdução A fim de preparar a geração de código, deve-se relacionar o fonte estático do programa às ações em tempo de execução. Durante a execução, o.
Banco de Dados I Profa. Jiani Cardoso 2/2005
TerraRadar Aplicativo para tratamento de imagem de Radar Utilizado através de dois tipos de interface : TerraView - (QT) Browser - (PHP)
Templates e Questões de Design Programas são geralmente construídos segundo um design que é relativamente bem mapeado nos mecanismos oferecidos pela linguagem.
Planejando seu site Objetivos Abordagem Sílvia Dota.
Sistemas de Tutoria Inteligente (STI) Visam proporcionar instrução de forma adaptada a cada aprendiz. STIs adaptam o processo de instrução a determinadas.
Matemática e Educação Ambiental.
Técnicas de Diagnóstico. Objetivo Caracterizar técnicas de diagnóstico para o modelo do estudante Caracterizar técnicas de diagnóstico para o modelo do.
Capítulo VII – Tipos Enumerativos e Estruturas 7.1 – Tipos enumerativos 7.2 – A necessidade de estruturas 7.3 – Manipulação dos campos de uma estrutura.
1.3 – Interpretadores – Compiladores versus Interpretadores
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo XI Encadeamento de Estruturas por Ponteiros.
Capítulo IX – Ponteiros 9.1 – Introdução 9.2 – Relação entre ponteiros e variáveis indexadas 9.3 – Alocação dinâmica de memória 9.4 – Variáveis indexadas,
CE-262 Ontologia e Web Semântica Prof. José M Parente de Oliveira Sala 120 – Prédio da Computação Lógica de Descrições.
Jumpers 1. O que são Jumpers
Função Gráficos. Domínio e imagem no gráfico.
Probabilidade e Esperança Condicional
Modelos de Iluminação Daniel Lemos. Definição MODELOS DE ILUMINAÇÃO são técnicas usadas para calcular a intensidade da cor de um ponto a ser exibido.
Missão Visão Valores.
FUNDAÇÃO CARLOS CHAGAS
Implementação Do JXTA Como Protocolo De Transporte Do JacORB
Business Process Management e Workflow - jBPM Aluno: Filipe Ferraz Salgado Orientador: Francisco Reverbel Novembro 2006.
Já definimos o coeficiente angular de uma curva y = f(x) no ponto onde x = x 0. Derivadas Chamamos esse limite, quando ele existia, de derivada de f em.
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Teorema do Confronto Se não pudermos obter o limite diretamente, talvez possamos obtê-lo indiretamente com o teorema do confronto. O teorema se refere.
Interpolação Introdução Conceito de Interpolação
Aritmética de ponto flutuante Erros
Organização de Sistemas de Computadores
Desempenho A rápida taxa de melhoria na tecnologia de computadores veio em decorrência de dois fatores: avanços na tecnologia utilizada na construção.
C/C++.
Laboratório de Programação Prof. Oscar Luiz Monteiro de Farias
Prof. Giovanny Lucero Introdução Prof. Giovanny Lucero
Tecnologia para Web JavaScript Enrique Pimentel Leite de Oliveira
Recursividade Estrutura de Dados.
Adriano Santiago Wilber Garcia Pereira
Entendendo as definições de classe
LINGUAGENS DE PROGRAMAÇÃO
04:27 Introdução Tipos de Fluxo de Dados e de Arquivos Manipulação de Arquivos em Java Classes FileReader e FileWriter Classes FileInputStream e FileOutputStream.
Sistemas de Informação Prof. Me. Everton C. Tetila Modelo de dados relacional Banco de Dados I.
Programação Concorrente com Thread Java
OpenGL Computação Gráfica. O que é OpenGL? Uma linguagem de programação gráfica de baixo nível Projetada para gráfico interativo 2D e 3D Uma interface.
Introdução Ciência da Computação estudo de algoritmos –ÊNFASE ao estudo de DADOS armazenamento manipulação refinamento (a partir de dados cru) estrutura.
8. Uma Função de duas Variáveis Aleatórias
Professor: Hyggo Almeida
Sincronização com Locks. Locks É um mecanismo de sincronização de processos/threads em que estas devem ser programadas de modo que seus efeitos sobre.
Melhorias e Mensagens Amigáveis ao Usuário Centro de Informática Universidade Federal de Pernambuco Bruno Felipe Marco André Paulo Fernando Rodolfo Santos.
Java Generics Adeline de Sousa Silva.
Alisson Rafael Appio SOP aplicado em um jogo tipo de corrida usando a arquitetura cliente e servidor Alisson Rafael Appio
Transcrição da apresentação:

Design Patterns – Composite e Visitor Lúbia Vinhas

Composite Compor objetos em estruturas de árvore a fim de expressar hierarquias do tipo todo-parte. Composite permite que clientes tratem elementos ou compostos de elementos de maneira uniforme Aplicabilidade: use o padrão Composite quando: Deseja representar hierarquias de objetos do tipo todo-parte Deseja que os clientes da classe possam ignorar as diferenças entre objetos e composições de objetos

Composite – Exemplo motivador Uma figura pode ser uma linha, um retângulo, um texto ou uma combinação de linhas, retângulos ou textos Para o cliente que quer desenhar uma figura não importa se ela é a individual ou a composta

Composite – Estrutura Básica Benefícios: É fácil adicionar novos componentes Clientes ficam simples, uma vez que não precisam se preocupar com o que estão tratando: elemento ou composto Desvantagem: difícil restringir o tipo de componentes em um composto

Composite – Questões de implementação Um composto conhece seus filhos, devem os filhos conhecer seus pais? Onde devem estar os métodos que tratam do gerenciamento dos filhos? Privilegia Transparência Privilegia Segurança

Composite – Questões de implementação Onde deve estar a lista de componentes? No componente ou no composite? A ordem dos filhos é importante? Quem deve destruir os filhos? Qual a melhor estrutura para armazenar os filhos?

Composite – Exemplo Uma GUI possui um conjunto de elementos: botões, menus, campos de texto (widgets). Uma widget pode também ser composta por diversos elementos

Composite – Exemplo Alternativa 1

Composite – Exemplo Alternativa 2

Composite – Exemplo

Composite – Ex. equipamentos

Composite – Exemplo Geometrias 2DPoint Componente atômico: um ponto no espaço 2D

Composite – Exemplo Geometrias Ring (linha fechada) Um anel é feito de pontos

Composite – Exemplo Geometrias Polígono Um polígono é feito de anéis

Composite – Exemplo Geometrias Polygon Set Um conjunto de polígonos é feito de polígonos

Composite – Exemplo Geometrias <template class T> class Composite { private: vector<T> components_; public: void insert ( const T& geom ) { components_.push_back ( geom ); T& operator [] ( int i ) { return components_[i] }; }

Composite – Exemplo Geometrias <template class T> class Composite { private: vector<T> components_; public: void insert ( const T& geom ) { components_.push_back ( geom ); T& operator [] ( int i ) { return components_[i] }; } typedef Composite<2DPoint> Ring;

Composite – Exemplo Geometrias <template class T> class Composite { private: vector<T> components_; public: void insert ( const T& geom ) { components_.push_back ( geom ); T& operator [] ( int i ) { return components_[i] }; } typedef Composite<2DPoint> Ring; typedef Composite<Ring> Polygon;

Composite – Exemplo Geometrias Multi-paradigma em ação Reuso Economia de código

TerraLib - Geometrias Geometrias completamente diferentes possuem um comportamento similar definido pelo padrão composite

Visitor – Motivação Representar que operação seja executada sobre os elementos de uma estrutura. O padrão visitor permite que novas operações sejam definidas sem a necessidade de modificar a classe dos elementos em que opera Exemplo: considere um compilador que processa um programa e representa seus elementos como uma árvore sintática abstrata. A árvore possui diferentes tipos de nós como operadores, variáves e expressões matemáticas Algumas das operações que podem ser executadas sobre a árvore sintática : Verificar que todas as variáveis estão definidas Verificar que as variáveis estão incializadas antes de seu uso Verificação de tipos Geração de código Formatação

Visitor – Motivação As operações podem necessitar tratar cada tipo de nó de maneira diferente Uma alternativa: definir cada operação na classe específica Inclusão de novas operações requer a mudança de todas as classes de nós Pode ser confuso ter essa diversidade de operações em cada classe nó: P. ex. mistura de verificação de tipos com formatação

Visitor – Motivação Outra solução é encapsular a operação em um objeto em separado, chamado Visitor O objeto Visitor percorre os elementos da árvore Quando um nó da árvore “aceita” um visitor, ele chama um método seu que inclui o tipo do nó como argumento O visitor então executa a operação para aquele nó (a operação que costumava estar na classe nó)

Visitor – Motivação

Visitor - Aplicabiblidade Quando existem muitas operações distintas e não relacionadas que precisam ser executadas sobre os objetos de uma estrutura e você deseja evitar a poluição das classes com essas operações Quando as classes definem uma estutura de objetos que quase nunca muda, mas frequentemente você necessita definir novas operações sobre essas estrutura se a estrutura da classe dos objetos muda frequentemente, é provavelmente melhor definir as operações nas classes Quando uma estrutura contém muitas classes de objetos com diferentes interfaces e você deseja executar operações sobre esses objetos que dependem de uma classe concreta

Visitor – Estrutura

Visitor – Estrutura

Visitor – Consequências Benefícios Inclusão de novas operações é fácil Derivação das classes de Visitor agrupa comportamentos relacionados, sem propagá-los para a estrutura Visitors podem acumular estados enquanto visitam cada elemento da estrutura Desvantagens Inclusão de novas classes de elementos concretos é difícil. Cada novo elemento dá origem a um novo método abstrato no Visitor e corresponde a uma implementação em todas as classes concretas dos Visitors A interface dos elementos concretos deve ser poderosa o bastante para permitir que os Visitors executem sem trabalho. Você pode ser forçado a fornecer métodos públicos que permitem o acesso ao estado interno dos objetos, o que pode comprometer oencapsulamento da classe

Visitor – Consequências Requer uma função para cada subclasse da estrutura a ser visitada visit (subclassA&) visit (subclassB&)..... Funciona bem para classes com definições estáveis Mudança na classe a ser visitada implica numa mudança na classe “visitor” Cria uma dependência circular entre “visitante” e “visitado” Alternativas ao “visitor” Observer e Mediator são alternativas ao “visitor” Iterator é alternativa ao “visitor” quando os objetos a ser percorridos são de um mesmo tipo (e.g., listas)

Visitor – Consequências Visitor é baseado em uma técnica conhecida como double-dispatch Single-dispatch: dois critérios determinam qual operação é atende um determinado pedido: o nome do pedido e o tipo do recebedor do pedido ElementA::X  chama a operação X sobre o recebedor elementA ElementB::Y  chama a operação Y sobre o recebedor elementB Double-dispatch: a operação a ser executada depende do nome do pedido e de dois recebedores. Accept é uma operação double-dispatch, depende do Visitor e do eElemento. Esse é o ponto chave do padrão. A operação depende do tipo do elemento e do tipo do Visitor e do tipo do elemento que ele visita. Ao invés de acoplar as operações estaticamente na interface do elemento, as operações são consolidadas em um Visitor e usar o método Accept para acoplá-las em tempo de execução

Visitor ConcreteVisitor1 v; Element * p = new ConcreteElement1; p->accept(v); p é o receptor da mensagem accept(v); como accept(v) é polimórfica ela será executada com base no valor corrente de p, nesse caso é o elemento ConcreteElement1. A função accept(v) é sempre implementada como v.visit(this) como v é passado por referência, e visit() é polimórfica, esse código será executado com base no valor corrente de v, que nesse caso é ConcreteVisitor1 Executado = dispatch