(→Produtos) |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
Os visitantes implementam a interface <code>Visitante</code>: | Os visitantes implementam a interface <code>Visitante</code>: | ||
− | < | + | <source lang="java"> |
interface Visitante { | interface Visitante { | ||
void visita(Alface g); | void visita(Alface g); | ||
Line 10: | Line 10: | ||
void visita(Cebola c); | void visita(Cebola c); | ||
} | } | ||
− | </ | + | </source> |
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. | 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. | ||
Line 16: | Line 16: | ||
A primeira implementação adiciona a capacidade de descrição a cada produto hortÃcola. | A primeira implementação adiciona a capacidade de descrição a cada produto hortÃcola. | ||
− | < | + | <source lang="java"> |
class Descrição implements Visitante { | class Descrição implements Visitante { | ||
private String s; | private String s; | ||
Line 24: | Line 24: | ||
public void visita(Cebola c) { s = "Cebola"; } | public void visita(Cebola c) { s = "Cebola"; } | ||
} | } | ||
− | </ | + | </source> |
A primeira implementação simula a capacidade de interacção entre um animal (visitante) e um produto hortícola. | A primeira implementação simula a capacidade de interacção entre um animal (visitante) e um produto hortícola. | ||
− | < | + | <source lang="java"> |
class Animal implements Visitante { | class Animal implements Visitante { | ||
public void visita(Alface a) { System.out.println("Animal & Alface"); } | public void visita(Alface a) { System.out.println("Animal & Alface"); } | ||
Line 34: | Line 34: | ||
public void visita(Cebola c) { System.out.println("Animal & Cebola"); } | public void visita(Cebola c) { System.out.println("Animal & Cebola"); } | ||
} | } | ||
− | </ | + | </source> |
=== Produtos === | === Produtos === | ||
Line 40: | Line 40: | ||
A hierarquia de produtos hortícolas implementa uma interface comum que impõe a aceitação de visitantes. | A hierarquia de produtos hortícolas implementa uma interface comum que impõe a aceitação de visitantes. | ||
− | < | + | <source lang="java"> |
interface Hortícola { | interface Hortícola { | ||
void aceita(Visitante v); | void aceita(Visitante v); | ||
} | } | ||
− | </ | + | </source> |
Note-se que as várias implementações são meras esquematizações: a semelhança entre as implmentações do método <code>aceita</code> resulta da simplicidade do exemplo (o método pode ser, como seria de esperar, arbitrariamente complexo). | Note-se que as várias implementações são meras esquematizações: a semelhança entre as implmentações do método <code>aceita</code> resulta da simplicidade do exemplo (o método pode ser, como seria de esperar, arbitrariamente complexo). | ||
− | < | + | <source lang="java"> |
class Alface implements Hortícola { | class Alface implements Hortícola { | ||
public void aceita(Visitante v) { v.visita(this); } | public void aceita(Visitante v) { v.visita(this); } | ||
} | } | ||
− | </ | + | </source> |
− | < | + | <source lang="java"> |
class Batata implements Hortícola { | class Batata implements Hortícola { | ||
public void aceita(Visitante v) { v.visita(this); } | public void aceita(Visitante v) { v.visita(this); } | ||
} | } | ||
− | </ | + | </source> |
− | < | + | <source lang="java"> |
class Cebola implements Hortícola { | class Cebola implements Hortícola { | ||
public void aceita(Visitante v) { v.visita(this); } | public void aceita(Visitante v) { v.visita(this); } | ||
} | } | ||
− | </ | + | </source> |
=== Teste === | === Teste === | ||
Line 70: | Line 70: | ||
O teste utiliza uma ''factory'' simples para gerar produtos hortÃcolas aleatórios. | O teste utiliza uma ''factory'' simples para gerar produtos hortÃcolas aleatórios. | ||
− | < | + | <source lang="java"> |
class Horta { | class Horta { | ||
public static Hortícola produto() { | public static Hortícola produto() { | ||
Line 81: | Line 81: | ||
} | } | ||
} | } | ||
− | </ | + | </source> |
Note-se a acção dos visitantes no seguinte teste. | Note-se a acção dos visitantes no seguinte teste. | ||
− | < | + | <source lang="java"> |
public class Teste extends TestCase { | public class Teste extends TestCase { | ||
List<Hortícola> _produtos = new ArrayList<Hortícola>(); | List<Hortícola> _produtos = new ArrayList<Hortícola>(); | ||
Line 112: | Line 112: | ||
} | } | ||
} | } | ||
− | </ | + | </source> |
− | [[category: | + | [[category:Ensino]] |
− | [[category: | + | [[category:PO]] |
[[category:PO Exemplos]] | [[category:PO Exemplos]] | ||
+ | [[category:Java]] |
Contents |
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 {
private 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"); }
}
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); }
}
O teste utiliza uma factory simples para gerar produtos hortÃcolas aleatórios.
class Horta {
public static Hortícola produto() {
switch ((int)(Math.random() * 3)) {
default:
case 0: return new Alface();
case 1: return new Batata();
case 2: return new Cebola();
}
}
}
Note-se a acção dos visitantes no seguinte teste.
public class Teste extends TestCase {
List<Hortícola> _produtos = new ArrayList<Hortícola>();
public Teste() {
for (int i = 0; i < 10; i++)
_produtos.add(Horta.produto());
}
public void test() {
// Apresenta as descrições de cada produto
Descrição dsc = new Descrição();
for (Hortícola h : _produtos) {
h.aceita(dsc);
System.out.println(dsc);
}
// Animal visita horta
Animal a = new Animal();
for (Hortícola h : _produtos)
h.aceita(a);
}
public static void main(String args[]) {
new Teste().test();
}
}