(→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çã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">"Alface"</FONT>; } | ||
+ | <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Batata b) { s = <FONT COLOR="#004488">"Batata"</FONT>; } | ||
+ | <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Cebola c) { s = <FONT COLOR="#004488">"Cebola"</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">"Animal & Alface"</FONT>); } | ||
+ | <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Batata b) { System.out.println(<FONT COLOR="#004488">"Animal & Batata"</FONT>); } | ||
+ | <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Cebola c) { System.out.println(<FONT COLOR="#004488">"Animal & Cebola"</FONT>); } | ||
+ | } | ||
+ | |||
+ | === Produtos === | ||
Produtos hortÃcolas. | Produtos hortÃcolas. | ||
[[category:PO 2005/2006]] | [[category:PO 2005/2006]] |
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".
O padrão visitor tem a seguinte estrutura de classes:
As colaborações entre os intervenientes são as que figuram no seguinte diagrama de sequência:
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 hortÃcolas.