As classes Formatador e ElementosAFormatar

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

Padrões de Design. Padrões de Design. Abstract Factory. Padrões de Design. Padrões de Design Abstract Factory. Abstract Factory.

JMENU, JDESKTOPPANE E JINTERNALFRAME

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

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

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

INF011 Padrões de Projeto. 11 Composite

Creational Patterns Factory method

Strategy e Template Method. Professor: Hyggo Almeida

Programação II. Cassio Diego

Gerenciadores de Layout

Orientação a Objetos Interfaces

Layout. Programação Orientada a Objetos Java. Prof. Geraldo Braz Junior. Baseado em material original de João Carlos Pinheiro CEFET/MA

Abstract Factory. Edeyson Andrade Gomes

INF011 Padrões de Projeto. 03 Abstract Factory

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

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

Padrões de Projeto de Software

Tiago Alves de Oliveira. Tiago Alves de Oliveira

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

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos 2 Prof. Fabiano Dorça. Padrões de Projeto.

Programação Orientada a Objetos

Padrões de Projeto de Software Orientado a Objetos

PROJETO ARQUITETURAL PARTE II: PADRÕES DE PROJETO. Projeto de Programas PPR0001

Definição. Em POO, a abstração é o processo de esconder os detalhes de implementação de uma aplicação.

Padrões de Projeto de Software

LSD LSD PICC. Manuela Sousa

Estilo: BlackBoard. BlackBoard = repositório de dados compartilhados

3 Uma Abordagem Orientada a Aspectos para o Desenvolvimento de Frameworks

Computação II (MAB 225)

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

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

Java - Herança e Interface

UNIDADE 5 Aplicação dos Conceitos de Orientação a Objetos

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

Computação II Orientação a Objetos

Padrões de Projeto. Parte 1. Prof. Fellipe Aleixo

Computação II Orientação a Objetos

Padrões de Projeto. Abstract Factory

Engenharia de Software

Web Presentation Patterns - Controllers

Computação II Orientação a Objetos

Classes e Objetos. Sintaxe de classe em Java

Factory Pattern. SISMO - Sistemas e Mobilidade Junho de Departamento de Informática / UFMA

Padrões Comportamentais

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

Padrões de Projeto de Software

Orientação a objetos. Objetos ou Instâncias I

O PARADIGMA ORIENTADO POR OBJETOS

Grupo de Usuários Java do Noroeste Paulista. Tópicos Avançados em Java

Objetivos. Explorar os conceitos fundamentais acerca do uso herança na linguagem Java

Padrões GoF Strategy, Observer, Singleton, Abstract Factory e outros...

Introdução à Análise e Projeto de Sistemas

Singleton. Como a maioria dos programadores organizaria o código para acessar informação de configuração? Eis um exemplo:

Computação II Orientação a Objetos

Computação II Orientação a Objetos

Computação II (MAB 225)

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

4 Arquitetura. Figura 1 Relacionamento entre as entidades do sistema de comentários. Comentário Tópico Categoria

Repetindo mais código?

Word. Introdução. Introdução. Introdução. Interface padrão Margem esquerda da página. Interface padrão

Linguagem de Programação III

TAD: Tipo Abstrato de Dados (parte 1)

SEMINÁRIOS INTEGRADOS EM ADS PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

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

Programação Java. Construção de Interface gráfica. Processo Básico: OO + Eventos. Exemplo

Aula 4 Encapsulamento e Relacionamento Cleverton Hentz

SCC-202 Algoritmos e Estruturas de Dados I. Profa. Graça Nunes 2º. Semestre 2010

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

Modelo de Componentes CORBA

Modificadores de Acesso JAVA

LÓGICA DE PROGRAMAÇÃO (JAVA) CLASSES E OBJETOS. Professor Carlos Muniz

A formatação condicional, usando cores no Excel é, sem dúvidas, um recurso que facilita muito a interpretação de planilhas.

Computação II Orientação a Objetos

TAD: Tipo Abstrato de Dados (parte 1)

Diagramas de Classes. ESII Profª. Andressa Falcade URI Santiago

RPC e RMI. Sistemas Distribuídos. Mauro Lopes Carvalho Silva. Professor EBTT DAI Departamento de Informática Campus Monte Castelo

ALUNO: RONI FABIO BANASZEWSKI

AULA 2 VISÃO BÁSICA DE CLASSES EM PHP

Padrão de projeto de software

Orientação a Objetos

Administração Central 2019 São Paulo

Conceitos de Programação Orientada a Objetos

INF011 Padrões de Projeto. 05 Factory Method

Modelo do Mundo Real. Abstração. Interpretação

Microsoft Word 2010 NORMA ABNT para Trabalhos Acadêmicos Conceitos Básicos

Prof. Fernando V. Paulovich 25 de julho de SCC Programação Orientada a Objetos

Computação II Orientação a Objetos

Desenvolvimento de Sistemas Orientados a Objetos com UML UP/RUP: Projeto

Structural Patterns - Bridge

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

Desenvolvimento de Aplicações Desktop

Tecnologias da Informação e Comunicação 9º Ano Escola Básica Miradouro de Alfazina

Introdução aos Padrões de Projeto. Sylvio Barbon Jr

Interfaces e Classes Abstratas

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

JAVA. Gerenciadores de Layout. Tiago Alves de Oliveira

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

Transcrição:

Introdução Vamos considerar o problema de formatação no editor de documentos WYSIWYG Já sabemos como é a representação da informação Mas ainda não sabemos como gerar uma estrutura particular de linhas, colunas e objetos simples para um documento particular Isso é resultado da formatação do documento Para simplificar, a palavra "formatação" significa apenas quebrar em linhas O resto da formatação pode ser tratado de forma análoga Automatizar a formatação não é simples Há um trade-off entre velocidade de formatação e a qualidade resultante Muitas coisas devem ser consideradas tais como a "cor" de um documento (o espalhamento uniforme de espaços em branco, sem criar "rios") Muitos algoritmos têm sido propostos e podem ser usados no editor O algoritmo pode até mudar em tempo de execução Considere a formatação em Word com "layout normal" (simples) e "layout da página" (mais demorado porém mais WYSIWYG) Ponto importante: queremos manter o algoritmo de formatação isolado da estrutura do documento Podemos adicionar elementos gráficos sem afetar o algoritmo de formatação Podemos mudar o algoritmo de formatação sem afetar o tratamento de elementos de documento Isolaremos o algoritmo de formatação através de sua encapsulação num objeto Usaremos uma hierarquia de classes para objetos que Página 1 de 9

encapsulam algoritmos de formatação A raiz da hierarquia será uma interface suficientemente genérica para suportar uma larga gama de algoritmos Cada subclasse implementa a interface para um algoritmo particular As classes Formatador e ElementosAFormatar A classe Formatador é usada para objetos que encapsulam um algoritmo de formatação As subclasses de Formatador implementam algoritmos de formatação específicos Os elementos a formatar são filhos de uma subclasse especial de ElementoDeDocumento (ElementosAFormatar) Tem um único objeto da classe ElementosAFormatar ElementosAFormatar existe por dois motivos: Para ser pai dos elementos básicos quando não tem formatação feita ainda Já que o pai é normalmente um ElementoDeDocumentoIF, ElementosAFormatar também o é Para manter referência ao formatador Quando um objeto ElementosAFormatar é criado, ele cria uma instância de uma subclasse de Formatador, especializada em formatar de alguma forma O objeto ElementosAFormatar pede ao formatador para formatar seus elementos quando necessário Por exemplo, quando há uma mudança ao documento Ver a estrutura de classes abaixo Página 2 de 9

Um objeto ElementosAFormatar não formatado contém apenas os elementos básicos visíveis (sem Composites linha, coluna, etc.) Quando os ElementosAFormatar precisam de formatação, o objeto chama o formatador O formatador varre os filhos de ElementosAFormatar e insere os elementos linha, coluna, etc. de acordo com o algoritmo de formatação Ver resultado dos objetos abaixo Página 3 de 9

Formatadores diferentes implementam algoritmos diferentes FormatadorSimples é o mais simples e rápido (não tem cuidados especiais com "cor") e trata apenas uma linha de cada vez FormatadorTeX é mais complexo pois considera o parágrafo inteiro para distribuir os espaços em branco e evitar "rios" FormatadorArray coloca um número igual de elementos em cada linha (para alinhar imagens, por exemplo) Resultado: a separação Formatador- ElementosAFormatar assegura uma separação forte entre o código que suporta a estrutura do documento e o código de formatação Podemos adicionar novos formatadores sem tocar nas classes de elementos e vice-versa Podemos até mudar de formatador em tempo de execução com uma função setformatador na classe ElementosAFormatar Página 4 de 9

O padrão que usamos chama-se O padrão Objetivo Definir uma família de algoritmos, encapsular cada um, e torná-los intercambiáveis permite mudar os algoritmos independentemente dos clientes que os usam Também conhecido como Policy Quando usar o padrão? Várias classes relacionadas têm apenas comportamento diferente Você precisa de variantes de um algoritmo Exemplo: com trade-offs diferentes de espaçotempo Para esconder dos clientes os dados complexos que um algoritmo usa Uma classe tem vários comportamentos escolhidos com muitas decisões Em vez de usar decisões, mova os trechos apropriados para sua própria classe Estrutura genérica Página 5 de 9

Participantes EstratégiaIF (exemplo: FormatadorIF) Declara a interface comum a todos os algoritmos O contexto usa essa interface para chamar o algoritmo definido em EstratégiaConcreta Estratégia (exemplo: Formatador) Possível classe abstrata para fatorar código comum entre os algoritmos EstratégiaConcreta (exemplo: FormatadorSimples) Implementa o algoritmo Contexto (exemplo: ElementosAFormatar) É configurado com um objeto EstratégiaConcreta Mantém uma referência para um objeto EstratégiaIF Pode definir uma interface para que a estratégia acesse seus dados Página 6 de 9

Colaborações entre objetos O Contexto pode chamar a Estratégia passando a si mesmo para que a estratégia acesse os dados O Contexto encaminha pedidos dos seus clientes para a Estratégia Clientes normalmente criam uma EstratégiaConcreta e a passam para o contexto A partir daí, os clientes interagem apenas com o Contexto Conseqüências do uso do padrão Uma alternativa à herança Poder-se-ia usar herança (subclasses de Contexto) para fazer a mesma coisa Teríamos uma hierarquia de ElementosAFormatar, cada um com um método formatar() diferente Em tempo de execução, instanciaríamos alguma subclasse de ElementoAFormatar Qual das subclasses instanciar depende do algoritmo específico de formatação que se deseja O problema: como mudar o algoritmo formatar() em tempo de execução?? Teria que fazer "mutação" do objeto ElementoAFormatar1 para um novo tipo ElementoAFormatar2 Mas a "mutação de tipo" é sinal de que o código fede! As linguagens não dão suporte para isso Solução melhor: retirar o método formatar e criar um objeto à parte só para este método Portanto, isso seria um mau exemplo do uso de herança Acopla o Contexto com os algoritmos (parafusa o Página 7 de 9

comportamento no Contexto) Deixa o Contexto mais difícil de entender, manter e estender O algoritmo não poderia variar dinamicamente Exemplo clássico de herança versus composição Estratégias eliminam statements condicionais Quando vários comportamentos estão agrupados na mesma classe Código que tem muitas condições assim é candidato para o padrão Ponto negativo: transparência incompleta dos 2 objetos Depois que o contexto é criado, os clientes enxergam apenas um objeto (o contexto) e não dois (contexto e estratégia) Porém, no momento da criação do contexto, alguma estratégia deve ser escolhida Os clientes devem portanto conhecer as estratégias antes de escolher uma Isso expõe os clientes a considerações de implementação Só usa quando a diferença de comportamento for relevante aos clientes Ponto negativo: mais objetos no projeto O padrão flyweight mostra como lidar com isso Exemplo na API Java Os Layout Managers de AWT são exemplos de classes que representam uma estratégia de layout para containers A EstratégiaIF é LayoutManager Também tem LayoutManager2 que é uma extensão de LayoutManager Não tem classe abstrata Estratégia Tem muitas classes concretas (GridLayout, FlowLayout, BorderLayout,...) O Contexto pode ser qualquer Container (Panel, Página 8 de 9

ScrollPane, Window,...) Perguntas finais para discussão O que ocorre quando um sistema tem uma explosão de objetos de estratégia? Tem uma forma melhor de gerenciar essas estratégias? Em Gamma, os autores descrevem duas formas pelas quais um objeto de estratégia pode obter a informação de que precisa para fazer seu trabalho. Uma forma descreve como um objeto de estratégia poderia receber uma referência a um objeto de contexto, permitindo assim o acesso aos dados de contexto. Mas não poderia ocorrer que os dados necessários à estratégia não estivessem disponíveis através da interface do objeto de contexto? Como remediar este possível problema? Ver também http://www.javaworld.com/javaworld/jw-04-2002/jw- 0426-designpatterns.html programa Página 9 de 9