Difference between revisions of "Visitor (padrão de desenho)/Produtos Hortícolas"

From Wiki**3

< Visitor (padrão de desenho)
Line 4: Line 4:
 
Os visitantes implementam a interface <code>Visitante</code>:
 
Os visitantes implementam a interface <code>Visitante</code>:
  
<java5>
+
<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);
 
   }
 
   }
</java5>
+
</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.
  
<java5>
+
<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"; }
 
   }
 
   }
</java5>
+
</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.
  
<java5>
+
<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"); }
 
   }
 
   }
</java5>
+
</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.
  
<java5>
+
<source lang="java">
 
   interface Hortícola {
 
   interface Hortícola {
 
     void aceita(Visitante v);
 
     void aceita(Visitante v);
 
   }
 
   }
</java5>
+
</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).
  
<java5>
+
<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); }
 
   }
 
   }
</java5>
+
</source>
  
<java5>
+
<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); }
 
   }
 
   }
</java5>
+
</source>
  
 
<java5>
 
<java5>
Line 64: Line 64:
 
     public void aceita(Visitante v) { v.visita(this); }
 
     public void aceita(Visitante v) { v.visita(this); }
 
   }
 
   }
</java5>
+
</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.
  
<java5>
+
<source lang="java">
 
   class Horta {
 
   class Horta {
 
     public static Hortícola produto() {
 
     public static Hortícola produto() {
Line 81: Line 81:
 
     }
 
     }
 
   }
 
   }
</java5>
+
</source>
  
 
Note-se a acção dos visitantes no seguinte teste.
 
Note-se a acção dos visitantes no seguinte teste.
  
<java5>
+
<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:
 
     }
 
     }
 
   }
 
   }
</java5>
+
</source>
  
 
[[category:Ensino]]
 
[[category:Ensino]]

Revision as of 16:50, 21 February 2019

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 {
    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"); }
  }

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); }
  }

<java5>

 class Cebola implements Hortícola {  
   public void aceita(Visitante v) { v.visita(this); }
 }

</source>

Teste

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();
    }
  }