Visitor (padrão de desenho): Difference between revisions
From Wiki**3
| Line 54: | Line 54: | ||
<FONT COLOR="#0000ff">interface</FONT> Hortícola { | <FONT COLOR="#0000ff">interface</FONT> Hortícola { | ||
<FONT COLOR="#0000ff"> | <FONT COLOR="#0000ff">void</FONT> aceita(Visitante v); | ||
} | } | ||
Revision as of 16:32, 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:
Diagrama de sequência
As colaborações entre os intervenientes são as que figuram no seguinte diagrama de sequência:
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
A hierarquia de produtos hortÃcolas implementa uma interface comum que impõe a aceitação de visitantes.
interface Hortícola {
void aceita(Visitante v);
}
Note-se que as várias implementações são meras esquematizações: a semelhança entre as implmentações do método aceita resulta da simplicidade do exemplo (o método pode ser, como seria de esperar, arbitrariamente complexo).
class Alface implements Hortícola {
public void aceita(Visitante v) { v.visita(this); }
}
class Batata implements Hortícola {
public void aceita(Visitante v) { v.visita(this); }
}
class Cebola implements Hortícola {
public void aceita(Visitante v) { v.visita(this); }
}