Interface com classe de herança

1 resposta
G

oi pessoal,

eu tenho a seguinte estrutura de herança no pacote de entidade.

Cadastro
|
Cliente
|
ClientePessoaFisica
ClientePessoaJuridica

Até aqui tudo bem, as quando eu fui desenvolver a classe de repositorio para cliente fiquei sem saber como fazer. Eu uso interface para implementar o repositorio.
Alguém poderia passar alguma dica de como implementar o repositorio? A minha duvida é o repositorio vai usar a classe Cliente ou a classe ClientePessoaFisica, e ou ClientePessoaJuridica ? Terei q fazer duas interface? A classe repositorio deve implementar qual das classes ? Se eu for ter que fazer dois repositórios uma para cada
classe não vejo a vantagem da herança na camada de entidade.

Agradeço por um exemplo ou manual ou documentação.

1 Resposta

BrunoFurtado

Cara,

Vc já deu alguma olhada nos padrões de projeto VO (Value Object), DTO (Data Transfer Object), Java Bean e similares?
Acredito que vale a pena uma pesquisada…

Diante desta situação, eu faria o seguinte:

/** interface comum a todos os cadastros */
public interface Cadastro {
   public boolean incluir(Object objeto);
   public boolean excluir(int codigo);
   public boolean alterar(Object objeto);
}


/** classe abstrata Cliente, nunca chamada de forma direta, sempre indiretamente através de subclasses */
public abstract class Cliente {
   private int id;
   private String nome;
   private String endereco;
   // outros atributos comuns a clientes físicos e juridicos

   // seus respectivos getters e setters
}


/** classe concreta, filha da Cliente e utilizada pela camada de persistencia (DAOs, VOs, outros)
      esta classe possui todos os atributos da classe Cliente, além de suas caracteristicas exclusivas */
public class ClientePessoaFisica extends Cliente {
   private String cpf;
   private String rg;
   // outros atributos

      // seus respectivos getters e setters
}


/** classe concreta, filha da Cliente e utilizada pela camada de persistencia (DAOs, VOs, outros)
      esta classe possui todos os atributos da classe Cliente, além de suas caracteristicas exclusivas */
public class ClientePessoaJuridica extends Cliente {
   private String cnpj;
   private String razao_social;
   // outros atributos

   // seus respectivos getters e setters
}


/** classe concreta, que por obrigacao tem de implementar todos os métodos comuns a qualquer cadastro
      esta classe tem a funcao de realizar apenas o cadastro de CLIENTES
      cadastros de PRODUTOS, FORNECEDORES e outros são realizados em outras classes que também devem implementar Cadastro */
public class CadastroClienteDAO implements Cadastro {
   public boolean incluir(Cliente cliente) {
      // incluir cliente, seja ele pessoa física ou juridica
   }
   
   public boolean excluir(int codigo) {
      // excluir cliente pelo id, atributo comum a toda subclasse de Cliente
      // no caso ClientePessoaFisica ou ClientePessoaJuridica
   }
   
   public boolean alterar(Cliente cliente) {
      // alterar cliente, seja ele pessoa física ou juridica
   }
}


/** utilizando a DAO em alguma parte do seu fonte
      preferenciamente na camada de negocios */
public class CadastroBO {


   // exemplo de utilizacao
   public boolean efetuarCadastro(Cliente cliente, Produto produto) {
      Cadastro cadastro = new CadastroClienteDAO();
      cadastro.incluir(cliente);
  
      cadastro = new CadastroProdutoDAO();
      cadastro.incluir(produto);

      // efetua um cadastro, seja ele de produto ou cliente, devido a interface
      // o cadastro pode ser de cliente físico ou juridico, assim como de qualquer tipo de produto e suas caracteristicas
   }

}
Criado 21 de janeiro de 2012
Ultima resposta 22 de jan. de 2012
Respostas 1
Participantes 2