Difference between revisions of "Visitor (padrão de desenho)"

From Wiki**3

(Exemplo)
Line 18: Line 18:
  
 
==Exemplo==
 
==Exemplo==
 +
 +
=== Visitantes ===
 +
 +
Os visitantes implementam a interface <code>Visitante</code>:
 +
 +
  <FONT COLOR="#0000ff">interface</FONT> Visitante {
 +
    <FONT COLOR="#0000ff">void</FONT> visita(Alface g);
 +
    <FONT COLOR="#0000ff">void</FONT> visita(Batata r);
 +
    <FONT COLOR="#0000ff">void</FONT> visita(Cebola c);
 +
  }
 +
 +
Note-se que esta interface prevê que os métodos sejam seleccionados por um mecanismo da linguagem (''overloading'') em lugar de se definir um conjunto de métodos com nomes explicitamente distintos.
 +
 +
A primeira implementação adiciona a capacidade de descrição a cada produto hortícola.
 +
 +
  <FONT COLOR="#0000ff">class</FONT> Descri&ccedil;&atilde;o <FONT COLOR="#0000ff">implements</FONT> Visitante {
 +
    String s; 
 +
    <FONT COLOR="#0000ff">public</FONT> String toString() { <FONT COLOR="#0000ff">return</FONT> s; }
 +
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Alface a) { s = <FONT COLOR="#004488">&quot;Alface&quot;</FONT>; }
 +
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Batata b) { s = <FONT COLOR="#004488">&quot;Batata&quot;</FONT>; }
 +
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Cebola c) { s = <FONT COLOR="#004488">&quot;Cebola&quot;</FONT>; }
 +
  }
 +
 +
A primeira implementação simula a capacidade de interacção entre um animal (visitante) e um produto hortícola.
 +
 +
  <FONT COLOR="#0000ff">class</FONT> Animal <FONT COLOR="#0000ff">implements</FONT> Visitante { 
 +
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Alface a) { System.out.println(<FONT COLOR="#004488">&quot;Animal &amp; Alface&quot;</FONT>); }
 +
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Batata b) { System.out.println(<FONT COLOR="#004488">&quot;Animal &amp; Batata&quot;</FONT>); }
 +
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Cebola c) { System.out.println(<FONT COLOR="#004488">&quot;Animal &amp; Cebola&quot;</FONT>); }
 +
  }
 +
 +
=== Produtos ===
  
 
Produtos hortícolas.
 
Produtos hortícolas.
  
 
[[category:PO 2005/2006]]
 
[[category:PO 2005/2006]]

Revision as of 17:24, 19 November 2005

Material correspondente à aula 29.

O padrão visitor permite separar uma estrutura de objectos de algoritmos que a ela possam ser associados em tempo de execução. A adição do comportamento processa-se sem alteração objecto "visitado".

Estrutura

Diagrama de classes

O padrão visitor tem a seguinte estrutura de classes:

Visitor-dpcd.png

Diagrama de sequência

As colaborações entre os intervenientes são as que figuram no seguinte diagrama de sequência:

Visitor-dpsd.png

Exemplo

Visitantes

Os visitantes implementam a interface Visitante:

 interface Visitante {
   void visita(Alface g);
   void visita(Batata r);
   void visita(Cebola c);
 }

Note-se que esta interface prevê que os métodos sejam seleccionados por um mecanismo da linguagem (overloading) em lugar de se definir um conjunto de métodos com nomes explicitamente distintos.

A primeira implementação adiciona a capacidade de descrição a cada produto hortícola.

 class Descrição implements Visitante {
   String s;  
   public String toString() { return s; }
   public void visita(Alface a) { s = "Alface"; }
   public void visita(Batata b) { s = "Batata"; }
   public void visita(Cebola c) { s = "Cebola"; }
 }

A primeira implementação simula a capacidade de interacção entre um animal (visitante) e um produto hortícola.

 class Animal implements Visitante {  
   public void visita(Alface a) { System.out.println("Animal & Alface"); }
   public void visita(Batata b) { System.out.println("Animal & Batata"); }
   public void visita(Cebola c) { System.out.println("Animal & Cebola"); }
 }

Produtos

Produtos hortícolas.