Visitor (padrão de desenho): Difference between revisions

From Wiki**3

(Redirected page to ist:Visitor (padrão de desenho))
 
(14 intermediate revisions by the same user not shown)
Line 1: Line 1:
Material correspondente à aula 29.
#REDIRECT [[ist:Visitor (padrão de desenho)]]
 
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:
 
[[Image:visitor-dpcd.png|600px]]
 
===Diagrama de sequência===
 
As colaborações entre os intervenientes são as que figuram no seguinte diagrama de sequência:
 
[[Image:visitor-dpsd.png|600px]]
 
==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&ccedil;&atilde;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">&quot;Alface&quot;</FONT>; }
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Batata b) { s = <FONT COLOR="#004488">&quot;Batata&quot;</FONT>; }
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Cebola c) { s = <FONT COLOR="#004488">&quot;Cebola&quot;</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">&quot;Animal &amp; Alface&quot;</FONT>); }
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Batata b) { System.out.println(<FONT COLOR="#004488">&quot;Animal &amp; Batata&quot;</FONT>); }
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> visita(Cebola c) { System.out.println(<FONT COLOR="#004488">&quot;Animal &amp; Cebola&quot;</FONT>); }
  }
 
=== Produtos ===
 
A hierarquia de produtos hortícolas implementa uma interface comum que impõe a aceitação de visitantes.
 
  <FONT COLOR="#0000ff">interface</FONT> Hort&iacute;cola {
    <FONT COLOR="#0000ff">    void</FONT> 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 <code>aceita</code> resulta da simplicidade do exemplo (o método pode ser, como seria de esperar, arbitrariamente complexo).
 
  <FONT COLOR="#0000ff">class</FONT> Alface <FONT COLOR="#0000ff">implements</FONT> Hort&iacute;cola { 
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> aceita(Visitante v) { v.visita(<FONT COLOR="#0000ff">this</FONT>); }
  }
 
  <FONT COLOR="#0000ff">class</FONT> Batata <FONT COLOR="#0000ff">implements</FONT> Hort&iacute;cola { 
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> aceita(Visitante v) { v.visita(<FONT COLOR="#0000ff">this</FONT>); }
  }
 
  <FONT COLOR="#0000ff">class</FONT> Cebola <FONT COLOR="#0000ff">implements</FONT> Hort&iacute;cola { 
    <FONT COLOR="#0000ff">public</FONT> <FONT COLOR="#0000ff">void</FONT> aceita(Visitante v) { v.visita(<FONT COLOR="#0000ff">this</FONT>); }
  }
 
[[category:PO 2005/2006]]

Latest revision as of 14:22, 7 November 2018