<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?action=history&amp;feed=atom&amp;title=Visitor_%28padr%C3%A3o_de_desenho%29%2FExpress%C3%B5es_Aritm%C3%A9ticas_Simples</id>
	<title>Visitor (padrão de desenho)/Expressões Aritméticas Simples - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?action=history&amp;feed=atom&amp;title=Visitor_%28padr%C3%A3o_de_desenho%29%2FExpress%C3%B5es_Aritm%C3%A9ticas_Simples"/>
	<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;action=history"/>
	<updated>2026-05-24T02:56:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;diff=11632&amp;oldid=prev</id>
		<title>Root at 14:48, 21 February 2019</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;diff=11632&amp;oldid=prev"/>
		<updated>2019-02-21T14:48:56Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;amp;diff=11632&amp;amp;oldid=5052&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;diff=5052&amp;oldid=prev</id>
		<title>Root: /* Resultados */</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;diff=5052&amp;oldid=prev"/>
		<updated>2013-11-21T22:21:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Resultados&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:21, 21 November 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l216&quot;&gt;Line 216:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 216:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:Ensino]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:Ensino]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;catagory&lt;/del&gt;:PO]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;category&lt;/ins&gt;:PO]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:PO Exemplos]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:PO Exemplos]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:Java]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:Java]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;diff=5051&amp;oldid=prev</id>
		<title>Root: /* Resultados */</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;diff=5051&amp;oldid=prev"/>
		<updated>2013-11-21T22:20:41Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Resultados&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 22:20, 21 November 2013&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l218&quot;&gt;Line 218:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 218:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[catagory:PO]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[catagory:PO]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:PO Exemplos]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[category:PO Exemplos]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;categoru&lt;/del&gt;:Java]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;category&lt;/ins&gt;:Java]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Root</name></author>
	</entry>
	<entry>
		<id>https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;diff=5050&amp;oldid=prev</id>
		<title>Root: Created page with &quot;O exemplo seguinte mostra um exemplo de uso do padrão Visitor.  O ponto de partida é uma hierarquia de expressões inteiras: neste exemplo, usam-se as funções aritméticas si...&quot;</title>
		<link rel="alternate" type="text/html" href="https://robots.hlt.inesc-id.pt/w/pt/index.php?title=Visitor_(padr%C3%A3o_de_desenho)/Express%C3%B5es_Aritm%C3%A9ticas_Simples&amp;diff=5050&amp;oldid=prev"/>
		<updated>2013-11-21T22:20:06Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;O exemplo seguinte mostra um exemplo de uso do padrão Visitor.  O ponto de partida é uma hierarquia de expressões inteiras: neste exemplo, usam-se as funções aritméticas si...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;O exemplo seguinte mostra um exemplo de uso do padrão Visitor.&lt;br /&gt;
&lt;br /&gt;
O ponto de partida é uma hierarquia de expressões inteiras: neste exemplo, usam-se as funções aritméticas simples e um valor literal.&lt;br /&gt;
&lt;br /&gt;
Para motivar o uso do padrão, considere-se a class &amp;#039;&amp;#039;&amp;#039;ADD&amp;#039;&amp;#039;&amp;#039; (soma binária), definida como se segue (&amp;#039;&amp;#039;&amp;#039;BinaryFunction&amp;#039;&amp;#039;&amp;#039; é uma superclasse abstracta comum a todas as operações binárias, que contém dois atributos do tipo &amp;#039;&amp;#039;&amp;#039;Content&amp;#039;&amp;#039;&amp;#039; (a superclasse de todas as expressões; neste primeiro exemplo, assume-se que declara o método &amp;#039;&amp;#039;&amp;#039;value()&amp;#039;&amp;#039;&amp;#039;, que retorna o valor calculado).&lt;br /&gt;
&lt;br /&gt;
Nesta classe, o método &amp;#039;&amp;#039;&amp;#039;value()&amp;#039;&amp;#039;&amp;#039; calcula o valor da expressão recursivamente, primeiro, pelo lado esquerdo (&amp;#039;&amp;#039;&amp;#039;left()&amp;#039;&amp;#039;&amp;#039;) e, depois, pelo lado direito (&amp;#039;&amp;#039;&amp;#039;right()&amp;#039;&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class ADD extends BinaryFunction {&lt;br /&gt;
  public int value() {&lt;br /&gt;
    return left().value() + right().value();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Esta implementação é suficiente para a avaliação da expressão. No entanto, que seria necessário alterar para conseguir utilizar a expressão &amp;#039;&amp;#039;&amp;#039;ADD&amp;#039;&amp;#039;&amp;#039; para outro fim? Por exemplo, para a traduzir para C? ou para outro fim?&lt;br /&gt;
&lt;br /&gt;
As respostas àquelas perguntas poderiam ser todas &amp;quot;acrescentar um método para esse fim&amp;quot;. No entanto, isso vem alterar a definição original da classe e novas evoluções são igualmente acompanhadas de impacto negativo e generalizado sobre este tipo de classes (as alterações teriam, potencialmente, que ser realizadas também em classes semelhantes).&lt;br /&gt;
&lt;br /&gt;
Utilizando o padrão Visitor, é possível remover as dependências de implementações específicas das classes de uma hierarquia de dados (esta hierarquia é, frequentemente, um Composite criado por uma fábrica).&lt;br /&gt;
&lt;br /&gt;
== Classes das Expressões (Composite) ==&lt;br /&gt;
&lt;br /&gt;
As classes das expressões estão organizadas segundo o padrão Composite e assentam sobre uma interface de topo. Escolheu-se uma interface e não uma classe abstracta por simplicidade e porque não há consequências relativamente a repetição de código.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public interface Content {&lt;br /&gt;
  int accept(Visitor v);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note-se que a interface, embora seja um tipo abstracto (nunca sendo realmente processada pelo &amp;quot;visitor&amp;quot;), tem de declarar uma interface comum a todas as expressões. Dada a simplicidade do cenário, apenas é necessário o método &amp;#039;&amp;#039;&amp;#039;accept&amp;#039;&amp;#039;&amp;#039;. Note-se que não é especificado qual o &amp;quot;visitor&amp;quot; específico.&lt;br /&gt;
&lt;br /&gt;
Abaixo desta interface existem duas classes que a implementam: a dos literais (&amp;#039;&amp;#039;&amp;#039;Literal&amp;#039;&amp;#039;&amp;#039;) e a das funções binárias (&amp;#039;&amp;#039;&amp;#039;BinaryFunction&amp;#039;&amp;#039;&amp;#039;). Assume-se que os literais são os únicos que guardam valores inteiros e que todas as outras expressões se definem recursivamente (Composite).&lt;br /&gt;
&lt;br /&gt;
Note-se a implementação de &amp;#039;&amp;#039;&amp;#039;accept&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class Literal implements Content {&lt;br /&gt;
  private int _value;&lt;br /&gt;
  public Literal(int value) { _value = value; }&lt;br /&gt;
  public int accept(Visitor v) { return v.visitLiteral(this); }&lt;br /&gt;
  public int value() { return _value; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A classe de base para as funções binárias limita-se a definir os atributos e métodos relacionados. Sendo abstracta, não necessita definir &amp;#039;&amp;#039;&amp;#039;accept&amp;#039;&amp;#039;&amp;#039; (será definido por todas as suas subclasses concretas).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public abstract class BinaryFunction implements Content {&lt;br /&gt;
  private Content _left;&lt;br /&gt;
  private Content _right;&lt;br /&gt;
  public BinaryFunction(Content left, Content right) { _left = left; _right = right; }&lt;br /&gt;
  public Content left() { return _left; }&lt;br /&gt;
  public Content right() { return _right; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finalmente, as quatro classes das expressões aritméticas simples (soma, subtracção, multiplicação, divisão), são definidas. Note-se a extrema simplicidade destas classes: ao ser utilizado um &amp;quot;visitor&amp;quot;, o comportamento delas migrou para as classes do padrão Visitor, deixando apenas a definição da inicialização e o método &amp;#039;&amp;#039;&amp;#039;accept&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class ADD extends BinaryFunction {&lt;br /&gt;
  public ADD(Content left, Content right) { super(left, right); }&lt;br /&gt;
  public int accept(Visitor v) { return v.visitADD(this); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class SUB extends BinaryFunction {&lt;br /&gt;
  public SUB(Content left, Content right) { super(left, right); }&lt;br /&gt;
  public int accept(Visitor v) { return v.visitSUB(this); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class MUL extends BinaryFunction {&lt;br /&gt;
  public MUL(Content left, Content right) { super(left, right); }&lt;br /&gt;
  public int accept(Visitor v) { return v.visitMUL(this); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class DIV extends BinaryFunction {&lt;br /&gt;
  public DIV(Content left, Content right) { super(left, right); }&lt;br /&gt;
  public int accept(Visitor v) { return v.visitDIV(this); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Classes de Visita (&amp;quot;visitors&amp;quot;) (Visitor) ==&lt;br /&gt;
&lt;br /&gt;
A interface &amp;#039;&amp;#039;&amp;#039;Visitor&amp;#039;&amp;#039;&amp;#039; define os métodos que devem ser implementados por todas as implementações. Implementações particulares podem definir outros métodos ou mesmo atributos. Por simplicidade, declara-se o retorno como um inteiro (isto permite que sejam obtidos valores recursivamente quando for apropriado).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public interface Visitor {&lt;br /&gt;
  int visitADD(ADD c);&lt;br /&gt;
  int visitSUB(SUB c);&lt;br /&gt;
  int visitMUL(MUL c);&lt;br /&gt;
  int visitDIV(DIV c);&lt;br /&gt;
  int visitLiteral(Literal c);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
No exemplo que aqui se apresenta, define-se, primeiro, um &amp;quot;visitor&amp;quot; para avaliação de expressões. A sua passagem a um método &amp;#039;&amp;#039;&amp;#039;accept&amp;#039;&amp;#039;&amp;#039; é como a chamada, no modelo original, ao método &amp;#039;&amp;#039;&amp;#039;value&amp;#039;&amp;#039;&amp;#039; sobre a classe original correspondente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class Evaluator implements Visitor {&lt;br /&gt;
  public int visitADD(ADD c) {&lt;br /&gt;
    return c.left().accept(this) + c.right().accept(this);&lt;br /&gt;
  } &lt;br /&gt;
  public int visitSUB(SUB c) {&lt;br /&gt;
    return c.left().accept(this) - c.right().accept(this);&lt;br /&gt;
  } &lt;br /&gt;
  public int visitMUL(MUL c) {&lt;br /&gt;
    return c.left().accept(this) * c.right().accept(this);&lt;br /&gt;
  } &lt;br /&gt;
  public int visitDIV(DIV c) {&lt;br /&gt;
    return c.left().accept(this) / c.right().accept(this);&lt;br /&gt;
  } &lt;br /&gt;
  public int visitLiteral(Literal c) {&lt;br /&gt;
    return c.value();&lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Como se pode ver, a recursão termina nos literais. Compare-se ainda esta implementação com a classe &amp;#039;&amp;#039;&amp;#039;ADD&amp;#039;&amp;#039;&amp;#039; mostrada acima.&lt;br /&gt;
&lt;br /&gt;
De seguida, para demonstrar como a funcionalidade pode ser muito diferente de classe de visita para classe de visita, mostra-se a classe &amp;#039;&amp;#039;&amp;#039;CWriter&amp;#039;&amp;#039;&amp;#039; que é capaz de produzir o código C para avaliar uma expressão.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class CWriter implements Visitor {&lt;br /&gt;
  String _cProgram = &amp;quot;&amp;quot;;&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    String program = &amp;quot;#include &amp;lt;stdio.h&amp;gt;\nint main() {\n\tprintf(\&amp;quot;%d\\n\&amp;quot;, &amp;quot;;&lt;br /&gt;
    program += _cProgram;&lt;br /&gt;
    program += &amp;quot;);\n\treturn 0;\n}\n&amp;quot;;&lt;br /&gt;
    return program;&lt;br /&gt;
  }&lt;br /&gt;
  public int visitADD(ADD c) {&lt;br /&gt;
    _cProgram += &amp;quot;(&amp;quot;;&lt;br /&gt;
    c.left().accept(this);&lt;br /&gt;
    _cProgram += &amp;quot;+&amp;quot;;&lt;br /&gt;
    c.right().accept(this);&lt;br /&gt;
    _cProgram += &amp;quot;)&amp;quot;;&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  public int visitSUB(SUB c) {&lt;br /&gt;
    _cProgram += &amp;quot;(&amp;quot;;&lt;br /&gt;
    c.left().accept(this);&lt;br /&gt;
    _cProgram += &amp;quot;-&amp;quot;;&lt;br /&gt;
    c.right().accept(this);&lt;br /&gt;
    _cProgram += &amp;quot;)&amp;quot;;&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  public int visitMUL(MUL c) {&lt;br /&gt;
    _cProgram += &amp;quot;(&amp;quot;;&lt;br /&gt;
    c.left().accept(this);&lt;br /&gt;
    _cProgram += &amp;quot;*&amp;quot;;&lt;br /&gt;
    c.right().accept(this);&lt;br /&gt;
    _cProgram += &amp;quot;)&amp;quot;;&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  public int visitDIV(DIV c) {&lt;br /&gt;
    _cProgram += &amp;quot;(&amp;quot;;&lt;br /&gt;
    c.left().accept(this);&lt;br /&gt;
    _cProgram += &amp;quot;/&amp;quot;;&lt;br /&gt;
    c.right().accept(this);&lt;br /&gt;
    _cProgram += &amp;quot;)&amp;quot;;&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  public int visitLiteral(Literal c) {&lt;br /&gt;
    _cProgram += Integer.toString(c.value());&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A ideia é produzir uma cadeia de caracteres com o programa C completo. De seguida, o método &amp;#039;&amp;#039;&amp;#039;toString&amp;#039;&amp;#039;&amp;#039; (o processo poderia ser outro) apresenta o programa equivalente. Utiliza-se este método por simplicidade: numa outra situação, o seu nome poderia ser outro.&lt;br /&gt;
&lt;br /&gt;
== Aplicação ==&lt;br /&gt;
&lt;br /&gt;
Finalmente, a aplicação começa por criar a composição (simulando uma fábrica) e envia instâncias das duas classes de visita, imprimindo os respectivos resultados.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;java5&amp;gt;&lt;br /&gt;
public class App {&lt;br /&gt;
  public static void main(String[] args) {&lt;br /&gt;
    // 1 + 2 * 3&lt;br /&gt;
    Content c = new ADD(new Literal(1), new MUL(new Literal(2), new Literal(3)));&lt;br /&gt;
    //&lt;br /&gt;
    int value = c.accept(new Evaluator());&lt;br /&gt;
    System.out.println(&amp;quot;1 + 2 * 3 = &amp;quot; + value);&lt;br /&gt;
    //&lt;br /&gt;
    Visitor cWriter = new CWriter();&lt;br /&gt;
    c.accept(cWriter);&lt;br /&gt;
    System.out.println(&amp;quot;==========================================&amp;quot;);&lt;br /&gt;
    System.out.println(cWriter);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/java5&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resultados ==&lt;br /&gt;
&lt;br /&gt;
O resultado é obtido através da execução do método &amp;#039;&amp;#039;&amp;#039;main&amp;#039;&amp;#039;&amp;#039; (assume-se a compilação prévia de todas as classes):&lt;br /&gt;
&lt;br /&gt;
 java App&lt;br /&gt;
&lt;br /&gt;
A saída é a seguinte:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;&lt;br /&gt;
1 + 2 * 3 = 7&lt;br /&gt;
==========================================&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, (1+(2*3)));&lt;br /&gt;
        return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[category:Ensino]]&lt;br /&gt;
[[catagory:PO]]&lt;br /&gt;
[[category:PO Exemplos]]&lt;br /&gt;
[[categoru:Java]]&lt;/div&gt;</summary>
		<author><name>Root</name></author>
	</entry>
</feed>