|
|
Line 18: |
Line 18: |
| ==Exemplo== | | ==Exemplo== |
|
| |
|
| === Visitantes ===
| | * [[Visitor (padrão de desenho)/Produtos Hortícolas]] |
|
| |
|
| Os visitantes implementam a interface <code>Visitante</code>:
| | == Exercícios == |
|
| |
|
| <java5>
| | * [[Visitor (padrão de desenho)/Exercício 1: Cálculo de Impostos|Cálculo de Impostos]] |
| interface Visitante {
| |
| void visita(Alface g);
| |
| void visita(Batata r);
| |
| void visita(Cebola c);
| |
| }
| |
| </java5>
| |
| | |
| 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.
| |
| | |
| <java5>
| |
| 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"; }
| |
| }
| |
| </java5>
| |
| | |
| A primeira implementação simula a capacidade de interacção entre um animal (visitante) e um produto hortícola.
| |
| | |
| <java5>
| |
| 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"); }
| |
| }
| |
| </java5>
| |
| | |
| === Produtos ===
| |
| | |
| A hierarquia de produtos hortícolas implementa uma interface comum que impõe a aceitação de visitantes.
| |
| | |
| <java5>
| |
| interface Hortícola {
| |
| void aceita(Visitante v);
| |
| }
| |
| </java5>
| |
| | |
| 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).
| |
| | |
| <java5>
| |
| class Alface implements Hortícola {
| |
| public void aceita(Visitante v) { v.visita(this); }
| |
| }
| |
| </java5>
| |
| | |
| <java5>
| |
| class Batata implements Hortícola {
| |
| public void aceita(Visitante v) { v.visita(this); }
| |
| }
| |
| </java5>
| |
| | |
| <java5>
| |
| class Cebola implements Hortícola {
| |
| public void aceita(Visitante v) { v.visita(this); }
| |
| }
| |
| </java5>
| |
| | |
| === Teste ===
| |
| | |
| O teste utiliza uma ''factory'' simples para gerar produtos hortÃcolas aleatórios.
| |
| | |
| <java5>
| |
| 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();
| |
| }
| |
| }
| |
| }
| |
| </java5>
| |
| | |
| Note-se a acção dos visitantes no seguinte teste.
| |
| | |
| <java5>
| |
| 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();
| |
| }
| |
| }
| |
| </java5>
| |
|
| |
|
| [[category:OOP]] | | [[category:OOP]] |
| [[category:Teaching]] | | [[category:Teaching]] |