Juliana França Santos Aquino

Slides:



Advertisements
Apresentações semelhantes
|Introdução a Java para programadores Telis. Jogo de Dados simples O jogo é jogado por dois jogadores. Cada jogador faz sua jogada (lança um dado), e.
Advertisements

I/O Carlos Bazilio Depto de Ciência e Tecnologia
Sockets Marco Antonio – marcoreis.net Arquiteto de Software Dezembro/2007.
Collections Marco Antonio, Arquiteto de Software – TJDF Atualizado Dezembro/2008.
Prof. Thiago Pereira Rique
Chain of Responsibility
Projeto de Sistemas de Software
Design Patterns Builder Pattern
Projeto de Sistemas de Software
Projeto de Sistemas de Software
Padrão de Projeto Interpreter
Projeto de Sistemas de Software Trabalho de Padrões de Projeto
Projeto de Sistemas de Software Kelly Leal Leandra Mara da Silva
Padrão Bridge (Handle/Body)
1 Builder Padrões de projeto Projeto de Sistemas de Software Aleksander Bruno Gadelha Setembro, 2008.
Projeto de Sistemas de Software Hazel, Juliana e Luana
Projeto de Sistemas de Software Fernando de Freitas Silva
Projeto de Sistemas de Software
Projeto de Sistemas de Software Fernando de Freitas Silva
Projeto de Sistemas de Software(PSS) Baldoino F. dos S. Neto
Padrões de Projeto Prototype.
Kleinner Farias e Raphael do Vale
Padrão de Projeto Iterator
Padrão Abstract Factory
Iniciação ao Java – Márcio F. Campos
Programação Básica em Java
Chain of Responsibility
Wagner Santos C. de Jesus
JAVA ENUMS © 2009 by Jorge L. de Souza Leão março de 2009 PEE - COPPE/UFRJ.
Capítulo 9 Herança 1.
A linguagem C#.
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
Padrão de Projeto Builder
CRIANDO OBJETOS EM JAVA
Concorrência em Java Threads em Java.
Tipos Agregados Homogêneos e Listas
Padrão de Projeto Visitor
JAVA Linguagem Ambiente de Desenvolvimento
Interfaces.
Linguagem técnica de programação I Java
Banco de Dados de Objetos
Estudo de Caso: um editor de documentos
Orientação a Objetos e Java Graduação em Ciência da Computação
Pilhas Profa. Nádia Félix.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Listas Simplesmente Encadeadas
Universidade Católica de Angola Prática de laboratório Fundamentos de Programação II Frei Joaquim José Hangalo.
Introdução às Java Threads
Aula Prática 4 Monitoria IP/CC (~if669).
Implementação Orientada a Objetos – Aula 05 Construtores e sobrecarga de métodos Prof. Danielle Martin Universidade de Mogi das Cruzes
Polimorfismo.
1 Padrões de Software Padrões GoF (Parte 2) Eduardo Bezerra Outubro/2005.
Melhorias e Mensagens Amigáveis ao Usuário Centro de Informática Universidade Federal de Pernambuco Bruno Felipe Marco André Paulo Fernando Rodolfo Santos.
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
Classes Abstratas e Interface
Exceções Profa. Patrícia A. Jaques Alterada por Leandro Tonietto abr-15.
Linguagem I Strings.
Herança e Arquitetura em camadas
Aula Prática 5 05/05/2010. //Estrutura do método public int subtrair (int a, int b){ //Calcule a operação desejada. int resultado = a – b; //Retorne o.
Herança Modelagem e Programação Orientada a Objetos
Padrões de Projeto Abstract Factory.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Unidade 5 – Integrando JSP e Servlets Prof.: Henrique Santos
Factory.
1 Baseado em whitepapers/eclipse-overview.pdf Nelson Lago IME/USP 04/2003 A Plataforma Eclipse.
Laboratório de Programação II Método main Dados e Métodos de Classes.
Padrões Criacionais Abstraem o processo de criação de instâncias (objetos), oferecendo flexibilidade no que é criado, por quem, como e quando.
Padrões de Projeto de Criação Padrões de Projeto Orientados a Objetos Prof a. Danielle Martin Universidade de Mogi das Cruzes.
Classes Abstratas e Interface. 2 Classe Abstrata  Uma classe abstrata serve apenas como modelo para uma classe concreta (classe que comumente usamos);
IDENTIFICAÇÃO DOS RELACIONAMENTOS Nesta atividade devem ser definidos os relacionamentos entre as classes Podem ser representados pela: – associação, –
Transcrição da apresentação:

Juliana França Santos Aquino Padrão Builder Juliana França Santos Aquino

Sumário Builder Introdução/Propósito Motivação Aplicabilidade Estrutura Participantes Colaborações Conseqüências Exemplo de Código © LES/PUC-Rio

Introdução/Propósito Um tipo de padrão criacional Classificação GoF Abstraem o processo de criação de objetos Separar a construção de um objeto complexo da sua representação O mesmo processo de construção possa criar diferentes apresentações Criar passo a passo objetos mais complexos Introdução: O padrão Builder é um tipo de padrão criacional segundo a classificação da famosa gangue dos quatro. E como sabemos, um padrão de criação abstrai o processo de instanciação. Ou seja, a criação dos objetos delegará a instanciação para outro objeto. Propósito: Separar a construção de um objeto complexo da sua representação de modo que o mesmo processo de construção possa criar diferentes apresentações © LES/PUC-Rio

Motivação (1/3) Um leitor de documentos RTF (Rich Text Format) deveria ser capaz de converter RTF em outros formatos de texto: ASCII TeX HTML etc. O número de conversões está aberto Facilidade de acrescentar uma nova conversão sem modificar o leitor Um leitor de documento RTF (Rich Text Format) deveria ser capaz de converter RTF em muitos formatos de texto. O leitor poderia converter documentos RTF em documentos ASCII comum ou widget de texto, que possa ser editado interativamente. O problema, contudo, é que o número de conversões possíveis é aberto. Por isso, deve ser fácil acrescentar uma nova conversão sem modificar o leitor. © LES/PUC-Rio

Motivação (2/3) TextConverter RTFReader ASCIIConverter TeXConverter ConverterCharacter(char) ConvertFontChange(Font) ConvertParagraph() RTFReader ParseRTF() while (t = get the next token) { switch t.Type { CHAR: builder->ConvertCharacter(t.Char) FONT: builder->ConvertFontChange (t.Font) PARA: builder->ConvertParagraph() } ASCIIConverter ConverterCharacter(char) GetASCIIText() TeXConverter ConverterCharacter(char) ConvertFontChange(Font) ConvertParagraph() GetTeXText() HTMLConverter ConverterCharacter(char) ConvertFontChange(Font) ConvertParagraph() GetHTMLText() Uma solução é configurar a classe RTFReader com um objeto TextConverter que converte RTF para uma outra representação de textos.À medida que o RTFTReader analisa o documento RTF, ele usa o objeto TextConverter para efetuar a conversão. Sempre que o RTFReader reconhece um símbolo RTF (texto simples, ou uma palavra do controle RTF), ele emite uma solicitação para o TextConverter para converter esse símbolo. Os objetos TextConverter são responsáveis tanto por efetuar a conversão dos dados como pela representação do símbolo num formato particular. As subclasses de TextConverter se especializam em diferentes conversões e formatos. Por exemplo, um ASCIIConverter ignora solicitações para converter qualquer coisa, exceto texto simples. Por outro lado, um TeXConverter implementará operações para todas as solicitações visando reproduzir uma representação TeX que capture toda a informaçõa estilística do texto. Um TextWidgetConverter produzirá um objeto para uma interface de usuário complexa que permite ao usuário ver e editar o texto. Cada tipo de classe conversora implementa o mecanismo para criação e montagem de um objeto complexo, colocando-o atrás de uma interface abstrata. O conversor é separado do leitor, que é responsável pela análise do documento RTF. ASCIIText TeXText HTMLText © LES/PUC-Rio

Aplicabilidade O objeto de construção deve permitir diferentes representações para o objeto que é construído O algoritmo para criação de um objeto complexo deve ser independente das partes que compõem o objeto e de como elas são montadas Cliente quer construir uma casa/prédio e o builder sabe como construir a casa/prédio (ela é composta de vários passos) © LES/PUC-Rio

Estrutura Director Construct() Builder BuildPart() ConcreteBuilder for all objects in structure { builder->BuildPart() } ConcreteBuilder BuildPart() GetResult() Product O padrão Builder captura todos estes relacionamentos. Cada classe conversora é chamada um builder no padrão, e o leitor é chamado director. Aplicado a este exemplo, o Builder separa o algoritmo para interpretar um formato de texto (isto é, o analisador de documentos RTF) de como um formato convertido é criado e representado. Isso nos permite reutilizar o algoritmo de análise (parsing) do RTFReader para criar diferentes representações de texto a partir do documento RTF – simplesmente configure o RTFReader com diferentes subclasses de TextConvert. © LES/PUC-Rio

Participantes (1/2) Builder (TextConvert) Especifica uma interface abstrata para criação de partes de um objeto-produto ou criação de diferentes representações ConcreteBuilder (ASCIIConverter, TeXConverter, HTMLConverter) Constrói partes do produto pela implementação da interface do Builder Define e mantém a representação que cria Fornece uma interface para recuperação do produto (GetASCIIText) © LES/PUC-Rio

Participantes (2/2) Director (RTFReader) Constrói um objeto usando a interface do Builder Product (ASCIIText, TeXText, HTMLText) Representa o objeto complexo em construção. ConcreteBuilder constrói a representação interna do produto e define o processo pelo qual ele é montado Inclui classes que definem as partes constituintes, inclusive as interfaces para a montagem das partes no resultado final © LES/PUC-Rio

Colaborações (1/2) O cliente cria o objeto Director e o configura com o objeto Builder desejado Director notifica o construtor sempre que uma parte do produto deve ser construída/convertida Builder trata solicitações do diretor e acrescenta partes ao produto O cliente recupera o produto do construtor © LES/PUC-Rio

new ConcreteBuilder() new Director (aConcreteBuilder) Colaborações (2/2) aClient aDirector aConcreteBuilder new ConcreteBuilder() new Director (aConcreteBuilder) Construct () BuildPartA() BuildPartB() BuildPartC() GetResult() © LES/PUC-Rio

Conseqüências Permite variar a representação interna de um produto Isola o código para construção e representação Oferece um controle mais fino sobre o processo de construção O objeto Builder fornece ao diretor uma interface abstrata para a construção do produto. A interface permite ao construtor ocultar a representação e a estrutura interna do produto. Ela também oculta como o produto é montado. Já que o produto é construído através de uma interface abstrata, tudo o que você tem que fazer para mudar sua representação interna é definir um novo tipo de construtor. O padrão Builder melhora o modularidade pela encapsulação da forma como um objeto complexo é construído e representado. Os clientes nada necessitam saber sobre as classes que definem a estrutura interna do produto; tais classes não aparecem na interface de Builder. Ao contrário de padrões de criação que constroem produtos de uma só vez, o Builder constrói o produto passo a passo sob o controle do diretor. Somente quando o produto está terminado o diretor o recupera do construtor. Daí a interface de Builder refletir o processo de construção do produto mais explicitamente do que outros padrões de criação. Isso dá um controle mais fino sobre o processo de construção e, consequentemente, da estrutura interna do produto resultante. © LES/PUC-Rio

Exemplo de Código (1/4) public class Cliente { public static void main(String[] args) { ConversorTexto conversor; if (args[0].equals("html")) conversor = new ConversorHTML(); else if (args[0].equals("tex")) conversor = new ConversorTeX(); else if (args[0].equals("ascii")) conversor = new ConversorASCII(); LeitorRTF leitor = new LeitorRTF(conversor); leitor.lerRTF(); } © LES/PUC-Rio

Exemplo de Código (2/4) class LeitorRTF { private ConversorTexto conversor; LeitorRTF(ConversorTexto c) { this.conversor = c; } public void lerRTF() { List<Token> tokens = obterTokensDoTexto(); for (Token t : tokens) { if (t.getTipo() == Token.Tipo.CARACTERE) conversor.converterCaractere(t.getCaractere()); if (t.getTipo() == Token.Tipo.PARAGRAFO) conversor.converterParagrafo(t.getParagrafo()); if (t.getTipo() == Token.Tipo.FONTE) conversor.converterFonte(t.getFonte()); © LES/PUC-Rio

Exemplo de Código (4/4) class ConversorTeX extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere TeX"); } public void converterParagrafo() { System.out.print("Parágrafo TeX"); public void converterFonte(Fonte f) { System.out.print("Fonte TeX"); // Similar para ConversorHTML, ConversorASCII © LES/PUC-Rio

Exemplo de Código (3/4) abstract class ConversorTexto { public void converterCaractere(char c); public void converterParagrafo(Paragrafo p); public void converterFonte(Fonte f); } © LES/PUC-Rio

Obrigada!