Como modelo polimorfismo com DAOs?

Olá pessoal,

Imaginem que tenho os seguintes beans:

  • Pessoa
  • Vendedor
  • Medico
  • AnalistaSistemas

Aonde as classes Medico, Vendedor e AnalistaSistemas são filhas da classe Pessoa. No momento de modelar as classes de persistência utilizando DAO seria melhor criar uma classe DAO pra cada entidade:

  • VendedorDAO
  • MedicoDAO
  • AnalistaSistemasDAO

ou criar uma classe DAO da pai:

  • PessoaDAO

Qual a forma mais usual de fazer essa modelagem?

Abraços.

Então, você pode colocar métodos comuns a todas as classes filhas na super classe Pessoa, assim reutiliza o código.

E os métodos particulares de cada classe filha você pode implementa-las nas próprias classes filhas.

Veja sobre designer patters, o padrão Strategy, ele te dará alguma luz sobre essa sua dúvida.

Se voce estiver em ambiente JPA, seus DAOs próprios são desnecessários no seu projeto.

A modelagem é flexível.
Da mesma forma que você não precisa colocar nos diagramas todas as classes, os métodos menos relevantes podem ser suprimidos.
É fato que, quando você trabalha com classes especializadas, muitos dos atributos e operações das classes pai não serão repetidos (não há razão para isto, pois a UML dá suporte para essa abstração).
Ainda mais em se tratando de uma herança polimórfica em que a sobrecarga de métodos vai ser peculiar a cada classe (Vendedor, Medico, etc).
Quando falar que é preciso salvar uma nova pessoa, sabe-se que ela será um medico, um vendedor através das business rules e do contexto atual.

Entendeu?

Não estou utilizando JPA. Estou utilizando simplesmente JDBC.

Estou mais preocupado com a modelagem orientada a objetos em si. Se eu tiver um método na classe PessoaDAO:

public void save(Pessoa pessoa, int tipo){ switch(tipo){ case MEDICO: //salva os dados do medico case VENDEDOR: // os dados do vendedor case ANALISTA_SISTEMAS: // os dados do analista de sistema } }

Essa forma de implementar é errada? Ou Seria melhor eu ter um método ‘save’ especifico pra cada filho de Pessoa?

Vê se você concorda comigo? Eu faria assim, lógico que existe milhões de maneiras de se fazer.

Minha classe Pessoa

public abstract class Pessoa {
	public abstract boolean save();
}

Minha classe Médico, implementando o método salvar imposto pelo pai

public class Medico extends Pessoa{

	@Override
	public boolean save() {
		//Salvo para um médico
		return false;
	}
}

Minha classe Arquiteto, implementando a seu modo o método imposto pelo pai

public class Arquiteto extends Pessoa {

	@Override
	public boolean save() {
		//Salvo para um arquiteto
		return false;
	}
}

Chamando minhas classes para executarem a tarefa de salvar.

public class Main {
	public static void main(String[] args) {
		
		Pessoa objeto = new Medico();
		objeto.save();
		
		Pessoa objeto2 = new Arquiteto()
		objeto.save();
	}
}

Acredito que assim fique melhor seu código, pois cada filho utiliza o método salve() a seu modo, e todos tem um contrato com o pai. Utilize polimorfismo e herança.

Abs
Rodrigo

Entendi sim Rodrigo. Brigadão pela ajuda!

Abraço!