vou te dar o exemplo do livro The Design Patterns - Java Compainion.
Suponha que vc tenha um objeto que modele sua empresa. Suponha que
esta empresa seja composta por diversos empregados. Logo, a sua classe
Empresa haverá uma referência para uma Collection de Empregados.
public class Empresa
{
public Empregado[] empregados;
}
public class Empregado
{
protected String nome;
protected int salario;
public String getNome()...
public int getSalario()...
public void setNome()...
public void setSalario()...
}
Agora, suponha que vc queira, por algum motivo, calcular os gastos
da sua empresa com salários. Ora, a abordagem mais natural seria fazer um
laço de repetição que fizesse um somatório dos salários individuais através
do método getSalario() mas, como o que queremos é demonstrar o Visitor,
utilizazá-lo-emos. :o)
A idéia é que tenhamos um objeto que visite todos os empregados da
empresa e vá calculando os custos parciais.
public abstract class Visitor
{
public abstract void visit(Empregado emp);
}
desta forma, podemos criar uma classe mais especializada:
public class SalaryVisitor extends Visitor
{
protected int salarioTotal;
public void visit(Empregado emp)
{
salarioTotal =+ emp.getSalario();
}
public int getSalarioTotal()
{
return salarioTotal;
}
}
O funcionamento é o seguinte: para uma classe ser visitada, ela deve
implementar algum método que possibilite esta visita.
public void accept(Visitor v)
{
v.visit(this)
}
Deu pra entender mais ou meons a idéia ? Para um Visitor visitar
alguém, ele chama o método accept daquele alguém. Por fim, o objeto visitado
retorna uma chamada ao método visit do Visitor passando uma referência de si
mesmo como parâmetro.
+---------+ visited.accept(this) +---------+
| | ----------------------> | |
| Visitor | <---------------------- | Visited |
| | v.visit(this) | |
+---------+ +---------+
Ok, e agora, como faremos as visitas ? Assim, ó:
//No cliente
SalaryVisitor sal = new SalaryVisitor();
for (int i = 0; i < empregados.length; i++)
{
empregados[i].accept(sal);
}
System.out.println("Orçamento com salários = " + sal.getSalarioTotal();
Você deve estar se perguntando por quê devemos implementar o método
visit(Empregado). Considere que existe um tipo de empregado, o Chefe, que
além do salário comum ainda possua uma gratificação:
public class Chefe extends Empregado
{
protected int gratificacao;
public int getGratificacao() { return gratificacao; }
public void accept(Visitor v)
{
v.visit(this);
}
}
Aí o Visit deverá ter algumas modificações
public class SalaryVisitor extends Visitor
{
protected int salarioTotal;
public void visit(Empregado emp)
{
salarioTotal =+ emp.getSalario();
}
public void visit(Chefe chf)
{
salarioTotal = salarioTotal + chf.getSalario() +
chf.getGratificacao();
}
public int getSalarioTotal()
{
return salarioTotal;
}
}
O exemplo não é dos melhores, mas é mais fácil de visualizar a utilização.
Para maiores (e melhores) informações, veja em
http://www.labsoftware.com/Patterns/index.htm
By Alê!
-----Mensagem original-----
De: Jorge Martins [mailto:[EMAIL PROTECTED]]
Enviada em: terça-feira, 3 de abril de 2001 12:19
Para: '[EMAIL PROTECTED]'
Assunto: RE: [java-list] tags libraries ou java beans? - (de quebra uma
p roposta para aumentarmos nossos conhecimentos)
Pode me dar um exemplo mais específico? Não saquei o exemplo do livro. Na
verdade nem consegui lê-lo direito, acho por ser o último padrão. :) De
qualquer forma, vou estudá-lo melhor.
abraços
Jorge
-----Original Message-----
From: Alexandre Rodrigues Gomes
[mailto:[EMAIL PROTECTED]]
Sent: segunda-feira, 2 de abril de 2001 17:49
To: '[EMAIL PROTECTED]'
Subject: RES: [java-list] tags libraries ou java beans? - (de quebra uma
p roposta para aumentarmos nossos conhecimentos)
Jorge, o que vc não entendeu no Visitor ?
O Visitor é legal quanto vc deseja efetuar alguma operação num conjunto de
objetos e a operação em cada objeto depende da classe que o instanciou.
By Alê!
-----Mensagem original-----
De: Jorge Martins [mailto:[EMAIL PROTECTED]]
Enviada em: segunda-feira, 2 de abril de 2001 12:54
Para: '[EMAIL PROTECTED]'
Assunto: RE: [java-list] tags libraries ou java beans? - (de quebra uma
p roposta para aumentarmos nossos conhecimentos)
Talvez você não esteja procurando exatamente um Design Pattern. Pode ser que
você deseje um framework.
Design Pattern é um padrão de desenho de software com objetivo de resolver
problemas recorrentes de modelagem. Coisas como criação hardcoded de
instâncias, flexibilidade para uso de plataformas e bibliotecas, etc. São
problemas bem gerais presentes na maioria das modelagens.
Framework é um conjunto de classes (um "upgrade" das antigas bibliotecas)
com objetivo de modelar um conjunto de regras de negócios comum a um escopo
específico. Há frameworks para Financeiros, Compiladores, Jogos, etc... O
Collection da Sun é um exemplo de framework de coleções.
Compre o livro Design Patterns - Elements of Reusable Object-Oriented
Software, da Gang of Four. Vale muito a pena, excelente livro. Ele discute
muito bem padrões de desenho e apresenta os 23 padrões fundamentais para um
desenvolvedor.
Só não espere moleza. Ontem mesmo estava relendo o livro e vislumbrei vários
detalhes que não tinha percebido e continuo sem entender certos pontos, como
o padrão Visitor.
abraços
Jorge
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
Sent: domingo, 1 de abril de 2001 01:08
To: [EMAIL PROTECTED]
Subject: [java-list] tags libraries ou java beans? - (de quebra uma
proposta para aumentarmos nossos conhecimentos)
boa madru para todos ,
Bom, estou lembrando agora, estou com umas duvidas. Se alguem quiser
responder:
1 - Atualmente estou usando java beans para separar o codigo da apresentacao
de minhas paginas jsp. Li na revista Java-Pro sobre as Tags Libraries, mas
nao entendi bem. Estou confuso pois na revista fala que estas Tags serao a
nova forma de separar codigo de apresentacao. E os java beans , o que serah
deles? E como poderei reutilizar estas Tags Libraries por exemplo em um
aplicativo StandAlone?
2 - Outra duvida de iniciante: Desing patterns (DP)
Li que existem varios DPs e cada um pode ser aplicado para cada tipo de
aplicacao. Bom, eu gostaria de saber, qual eh o DP mais apropriado para
sistemas WEB, digo , feitos em JSP.?
gente, eu tambem gostaria de trocar alguns codigos de sistemas jsp com voces
da lista... estou me sentindo um idiota trabalhando sozinho, e gostaria de
ver como voces estao programando para a web. esta semana fui em outra
empresa e achei hiper interessante o trabalho em grupo, gente mechendo com
design patterns, uml, ferramentas interessantes... Eu fico meio que ilhado
sendo um programador sem equipe. Talvez pudessemos trocar umas ideias de o
que usamos, como usamos, quais metodologias aplicamos, etc.
obrigado e boa noite a todos....
---
UOL: o melhor da Internet.
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------
------------------------------ LISTA SOUJAVA ----------------------------
http://www.soujava.org.br - Sociedade de Usuários Java da Sucesu-SP
dúvidas mais comuns: http://www.soujava.org.br/faq.htm
regras da lista: http://www.soujava.org.br/regras.htm
para sair da lista: envie email para [EMAIL PROTECTED]
-------------------------------------------------------------------------