Pessoal, estou desenvolvendo um sistema e surgiu algumas dúvidas em relação ao Padrão Facade.
Na minha aplicação tenho as entidades USUARIO, NOTICIA, BANNER
Implementando conforme um exemplo que achei utilizando o Facade ficou da seguinte maneira:
xhtml --> UsuarioMB --> UsuarioFacade –> UsuarioDAO – Usuario
xhtml --> NoticiaMB --> NoticiaFacade –> NoticiaDAO – Noticia
xhtml --> BannerMB --> BannerFacade –> BannerDAO – Banner
Nos 3 Facades acima tenho métodos criar/alterar/excluir/consultar(CRUD)
Eis a dúvida, o certo não seria criar um único Facade que faria ligação com todos DAOs?
Se sim, como devo implementar isso? Devo utilizar outro padrão junto com o Facade? e/ou devo utilizar Generics?
Desde já agradeço.
sim!
o ideal é encapsular todos os metodos e ser chamado por apenas um!
Olha, seu codigo poderia ficar mais bonito (minha opnião) assim:
xhtml --> UsuarioMB -->Facade --> UsuarioRN --> UsuarioDAO – Usuario
xhtml --> NoticiaMB --> Facade --> NoticiaRN --> NoticiaDAO – Noticia
xhtml --> BannerMB --> Facade -->BannerRN --> BannerDAO – Banner
Classe Genérica.
public abstract class AbstractFacade<T> {
public void salva(T entity) {
...
}
public void remove(T entity) {
...
}
public T procura(Object id) {
...
}
public List<T> listaTodos() {
...
}
}
Exemplo Classe PessoaFacade (Utilizando a classe de entidade Pessoa) herdando da classe genérica.
public class PessoaFacade extends AbstractFacade<Pessoa> implements PessoaFacadeImpl {
//Nesta classe, implementar as regras específicas para a pessoa e depois expor os métodos na interface.
}
Interface.
public interface PessoaFacadeImpl {
void salva(Pessoa p);
void remove(Pessoa p);
Pessoa procura(Object id);
List<Pessoa> listaTodos();
}
Exemplo de chamada no MB via DI.
public class PessoaManagedBean {
@EJB
private PessoaFacadeImpl pessoaImpl;
{
Espero ter ajudado.
[quote=maaarkin]Olha, seu codigo poderia ficar mais bonito (minha opnião) assim:
xhtml --> UsuarioMB -->Facade --> UsuarioRN --> UsuarioDAO – Usuario
xhtml --> NoticiaMB --> Facade --> NoticiaRN --> NoticiaDAO – Noticia
xhtml --> BannerMB --> Facade -->BannerRN --> BannerDAO – Banner [/quote]
É exatamente dessa forma que pretendo fazer, um único Facade na aplicação e separando a regra de negócio.
Mas é aí que tá, o único jeito que sei fazer é colocando todos métodos no facade, Ex.: incluirUsuario, alterarUsuario, incluirNoticia, AlterarNoticia, incluirBanner, alterarBanner etc
Creio que a forma ideal seria deixar apenas os métodos criar, alterar, excluir, pesquisar e fazendo suas respectivas chamadas de acordo com a entidade que passar.
Alguém teria algum exemplo implementando dessa forma?