Difference between revisions of "Composite (padrão de desenho)/Exercício 3: Construção e Visualização de Páginas"

From Wiki**3

< Composite (padrão de desenho)
(New page: = Problema = Uma página é constituída por vários elementos, que podem, ou não, ter eles próprios estrutura: imagens (são elementos atómicos que representam entidades gráficas); b...)
 
Line 1: Line 1:
 +
{{TOCright}}
 
= Problema =
 
= Problema =
  
Line 4: Line 5:
  
 
= Solução =
 
= Solução =
 +
 +
A solução contempla uma classe abstracta, que representa os elementos em geral, e uma classe concreta para cada conceito.
 +
 +
Na implementação que se apresenta abaixo, as páginas podem conter outras páginas.
 +
 +
== Classe Element ==
 +
 +
<java5>
 +
/**
 +
* This is an abstract page element.
 +
*/
 +
public abstract class Element {
 +
/**
 +
* @return "graphical" version of the element.
 +
*/
 +
public abstract String render();
 +
}
 +
</java5>
 +
 +
== Classe Image ==
 +
 +
Uma representação abstracta de uma imagem.
 +
 +
<java5>
 +
/**
 +
* An abstract image representation.
 +
*/
 +
public class Image extends Element {
 +
 +
/**
 +
* @see Element#render()
 +
*/
 +
@Override
 +
@SuppressWarnings("nls")
 +
public String render() {
 +
return "<image></image>";
 +
}
 +
 +
}
 +
</java5>
 +
 +
== Classe TextBlock ==
 +
 +
Esta classe representa um bloco de texto.
 +
 +
<java5>
 +
/**
 +
* A simple text block.
 +
*/
 +
public class TextBlock extends Element {
 +
 +
/**
 +
* Text in this block.
 +
*/
 +
private String _text;
 +
 +
/**
 +
* @param text
 +
*/
 +
public TextBlock(String text) {
 +
_text = text;
 +
}
 +
 +
/**
 +
* @see Element#render()
 +
*/
 +
@Override
 +
@SuppressWarnings("nls")
 +
public String render() {
 +
return "<textblock>" + _text + "</textblock>";
 +
}
 +
 +
}
 +
</java5>
 +
 +
== Classe Paragraph ==
 +
 +
Esta classe representa um conjunto de blocos de texto formando um parágrafo.
 +
 +
<java5>
 +
import java.util.ArrayList;
 +
 +
/**
 +
* A paragraph has several text blocks.
 +
*/
 +
public class Paragraph extends Element {
 +
/**
 +
* Text blocks in this paragraph.
 +
*/
 +
ArrayList<TextBlock> _textBlocks = new ArrayList<TextBlock>();
 +
 +
/**
 +
* @param textBlock
 +
*/
 +
void addTextBlock(TextBlock textBlock) {
 +
_textBlocks.add(textBlock);
 +
}
 +
 +
/**
 +
* @see Element#render()
 +
*/
 +
@Override
 +
@SuppressWarnings("nls")
 +
public String render() {
 +
String text = "<paragraph>\n";
 +
for (TextBlock textBlock : _textBlocks)
 +
text += textBlock.render() + "\n";
 +
text += "</paragraph>";
 +
return text;
 +
}
 +
}
 +
</java5>
 +
 +
== Classe Figure ==
 +
 +
Uma figura contém múltiplos elementos gráficos e uma legenda.
 +
 +
<java5>
 +
import java.util.ArrayList;
 +
 +
/**
 +
* A figure with images and a caption.
 +
*/
 +
public class Figure extends Element {
 +
/**
 +
* Images in this figure.
 +
*/
 +
ArrayList<Image> _images = new ArrayList<Image>();
 +
 +
/**
 +
* Legend for this figure.
 +
*/
 +
TextBlock _caption = new TextBlock(""); //$NON-NLS-1$
 +
 +
/**
 +
* @param image
 +
*/
 +
void addImage(Image image) {
 +
_images.add(image);
 +
}
 +
 +
/**
 +
* @param legend
 +
*/
 +
void setLegend(TextBlock legend) {
 +
_caption = legend;
 +
}
 +
 +
/**
 +
* @see Element#render()
 +
*/
 +
@Override
 +
@SuppressWarnings("nls")
 +
public String render() {
 +
String text = "<figure>\n";
 +
for (Image image : _images)
 +
text += image.render() + "\n";
 +
text += _caption.render() + "\n";
 +
text += "</figure>";
 +
return text;
 +
}
 +
}
 +
</java5>
 +
 +
== Classe Page ==
 +
 +
Classe que representa uma página. Uma página pode conter qualquer elemento, inclusivamente outras páginas.
 +
 +
<java5>
 +
import java.util.ArrayList;
 +
 +
/**
 +
* A simple text block.
 +
*/
 +
public class Page extends Element {
 +
 +
/**
 +
* Elements in this page (note that we admit recursive pages).
 +
*/
 +
private ArrayList<Element> _elements = new ArrayList<Element>();
 +
 +
/**
 +
* @param element element to be added to the page.
 +
*/
 +
public void addElement(Element element) {
 +
_elements.add(element);
 +
}
 +
 +
/**
 +
* @see Element#render()
 +
*/
 +
@Override
 +
@SuppressWarnings("nls")
 +
public String render() {
 +
String text = "<page>\n";
 +
for (Element element : _elements)
 +
text += element.render() + "\n";
 +
text += "</page>";
 +
return text;
 +
}
 +
}
 +
</java5>
 +
 +
== Classe App ==
 +
 +
Aplicação exemplo.
 +
 +
<java5>
 +
/**
 +
* Simple application.
 +
*/
 +
public class App {
 +
 +
/**
 +
* @param args
 +
*/
 +
public static void main(String[] args) {
 +
Page page = new Page();
 +
Paragraph p1 = new Paragraph();
 +
p1.addTextBlock(new TextBlock("Início."));
 +
p1.addTextBlock(new TextBlock("Segundo bloco com palavras,"));
 +
Image i1 = new Image();
 +
Image i2 = new Image();
 +
Figure figure = new Figure();
 +
figure.addImage(i1);
 +
figure.setLegend(new TextBlock("Imagem na figura."));
 +
page.addElement(p1);
 +
page.addElement(figure);
 +
page.addElement(i2);
 +
System.out.println(page.render());
 +
}
 +
 +
}
 +
</java5>
 +
 +
= Compilação e Execução =
 +
 +
== Compilação ==
 +
 +
== Execução ==
 +
 +
java App
 +
 +
Resultado:
 +
 +
<page>
 +
<paragraph>
 +
<textblock>Início.</textblock>
 +
<textblock>Segundo bloco com palavras,</textblock>
 +
</paragraph>
 +
<figure>
 +
<image></image>
 +
<textblock>Imagem na figura.</textblock>
 +
</figure>
 +
<image></image>
 +
</page>
  
 
[[category:PO]]
 
[[category:PO]]
 
[[category:Ensino]]
 
[[category:Ensino]]

Revision as of 03:34, 9 November 2009

Problema

Uma página é constituída por vários elementos, que podem, ou não, ter eles próprios estrutura: imagens (são elementos atómicos que representam entidades gráficas); blocos de texto (elementos atómicos que apenas podem conter texto); figuras (contêm uma ou mais imagens e podem ter uma legenda - um bloco de texto); parágrafos (podem vários blocos de texto). A página pode conter um ou mais elementos dos apresentados anteriormente. Todos os elementos implementam o método render, que permite apresentar a página. Escreva um método main que crie uma página e lhe adicione múltiplos elementos, por forma a permitir exemplificar a funcionalidade.

Solução

A solução contempla uma classe abstracta, que representa os elementos em geral, e uma classe concreta para cada conceito.

Na implementação que se apresenta abaixo, as páginas podem conter outras páginas.

Classe Element

<java5> /**

* This is an abstract page element.
*/

public abstract class Element { /** * @return "graphical" version of the element. */ public abstract String render(); } </java5>

Classe Image

Uma representação abstracta de uma imagem.

<java5> /**

* An abstract image representation.
*/

public class Image extends Element {

/** * @see Element#render() */ @Override @SuppressWarnings("nls") public String render() { return "<image></image>"; }

} </java5>

Classe TextBlock

Esta classe representa um bloco de texto.

<java5> /**

* A simple text block.
*/

public class TextBlock extends Element {

/** * Text in this block. */ private String _text;

/** * @param text */ public TextBlock(String text) { _text = text; }

/** * @see Element#render() */ @Override @SuppressWarnings("nls") public String render() { return "<textblock>" + _text + "</textblock>"; }

} </java5>

Classe Paragraph

Esta classe representa um conjunto de blocos de texto formando um parágrafo.

<java5> import java.util.ArrayList;

/**

* A paragraph has several text blocks.
*/

public class Paragraph extends Element { /** * Text blocks in this paragraph. */ ArrayList<TextBlock> _textBlocks = new ArrayList<TextBlock>();

/** * @param textBlock */ void addTextBlock(TextBlock textBlock) { _textBlocks.add(textBlock); }

/** * @see Element#render() */ @Override @SuppressWarnings("nls") public String render() { String text = "<paragraph>\n"; for (TextBlock textBlock : _textBlocks) text += textBlock.render() + "\n"; text += "</paragraph>"; return text; } } </java5>

Classe Figure

Uma figura contém múltiplos elementos gráficos e uma legenda.

<java5> import java.util.ArrayList;

/**

* A figure with images and a caption.
*/

public class Figure extends Element { /** * Images in this figure. */ ArrayList<Image> _images = new ArrayList<Image>();

/** * Legend for this figure. */ TextBlock _caption = new TextBlock(""); //$NON-NLS-1$

/** * @param image */ void addImage(Image image) { _images.add(image); }

/** * @param legend */ void setLegend(TextBlock legend) { _caption = legend; }

/** * @see Element#render() */ @Override @SuppressWarnings("nls") public String render() { String text = "<figure>\n"; for (Image image : _images) text += image.render() + "\n"; text += _caption.render() + "\n"; text += "</figure>"; return text; } } </java5>

Classe Page

Classe que representa uma página. Uma página pode conter qualquer elemento, inclusivamente outras páginas.

<java5> import java.util.ArrayList;

/**

* A simple text block.
*/

public class Page extends Element {

/** * Elements in this page (note that we admit recursive pages). */ private ArrayList<Element> _elements = new ArrayList<Element>();

/** * @param element element to be added to the page. */ public void addElement(Element element) { _elements.add(element); }

/** * @see Element#render() */ @Override @SuppressWarnings("nls") public String render() { String text = "<page>\n"; for (Element element : _elements) text += element.render() + "\n"; text += "</page>"; return text; } } </java5>

Classe App

Aplicação exemplo.

<java5> /**

* Simple application.
*/

public class App {

/** * @param args */ public static void main(String[] args) { Page page = new Page(); Paragraph p1 = new Paragraph(); p1.addTextBlock(new TextBlock("Início.")); p1.addTextBlock(new TextBlock("Segundo bloco com palavras,")); Image i1 = new Image(); Image i2 = new Image(); Figure figure = new Figure(); figure.addImage(i1); figure.setLegend(new TextBlock("Imagem na figura.")); page.addElement(p1); page.addElement(figure); page.addElement(i2); System.out.println(page.render()); }

} </java5>

Compilação e Execução

Compilação

Execução

java App

Resultado:

<page>
<paragraph>
<textblock>Início.</textblock>
<textblock>Segundo bloco com palavras,</textblock>
</paragraph>
<figure>
<image></image>
<textblock>Imagem na figura.</textblock>
</figure>
<image></image>
</page>