A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Juliana França Santos Aquino

Apresentações semelhantes


Apresentação em tema: "Juliana França Santos Aquino"— Transcrição da apresentação:

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

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

3 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

4 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

5 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

6 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

7 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

8 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

9 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

10 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

11 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

12 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

13 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

14 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

15 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

16 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

17 Obrigada!


Carregar ppt "Juliana França Santos Aquino"

Apresentações semelhantes


Anúncios Google