Padrão Facade

Oi pessoal,

Estou com dúvidas com relação ao padrão facade.
Vamos ao exemplo:
Temos um sistema de cadastro com as classes.

Curso (tem os métodos get’s e set’s)
CursoDAO (faz a comunicação com o banco)
GerenciadorCurso (bean que as páginas jsf acessarão para fazer insert, update, delete e consultas)

Pergunta?
A classe GerenciadorCurso é um facade?
Se GerenciadorCurso não é facade o que ele é, como ficaria um facade com essa estrutura?
Se eu tiver vários cadastros, turma, aluno, etc… Terei que criar um Gerenciador para cada uma, ou tem alguma forma de criar um gerenciador único?

Obrigado pela atenção.

Facade é uma classe que serve apenas como capa para outra classe ou conjunto de classes, objetivando simplificar a interface entre objetos ou camadas.
http://en.wikipedia.org/wiki/Facade_pattern

Se o teu GerenciadorCurso tem este perfil, então ele é um Facade ou um Business Delegator (que pra mim, é praticamente a mesma coisa).

Mas pelo que você descreveu, pra mim ele está mais para um Service.

E respondendo a sua pergunta, a minha opinião é que sim, para cada conjunto de casos de uso (no seu exemplo, os casos de uso CRUD de um objeto) você terá um gerenciador que fará a chamada ao DAO. O que você pode fazer é generalizar as partes comuns do gerenciador.

Eu não manjo muito de JSF, mas pelo que eu entendo o managed bean é uma DispatchAction do Struts mais estruturada.

maurenginaldo,

No seu caso você está aplicando “Application Façade” [Fowler]

No geral, serve para:

  1. Gerenciar a transação para que tudo ocorra “atômicamente”;

  2. Concentrar os seus TDD a respeito do Objetivo.

Nem sempre você precisa de um AppFacade.

Rodrigo Y.

[quote=maurenginaldo]Oi pessoal,

Estou com dúvidas com relação ao padrão facade.
Vamos ao exemplo:
Temos um sistema de cadastro com as classes.

Curso (tem os métodos get’s e set’s)
CursoDAO (faz a comunicação com o banco)
GerenciadorCurso (bean que as páginas jsf acessarão para fazer insert, update, delete e consultas)

Pergunta?
A classe GerenciadorCurso é um facade?
Se GerenciadorCurso não é facade o que ele é, como ficaria um facade com essa estrutura?
Se eu tiver vários cadastros, turma, aluno, etc… Terei que criar um Gerenciador para cada uma, ou tem alguma forma de criar um gerenciador único?

Obrigado pela atenção.

[/quote]

Tente não utilizar classes apenas com get’s e set’s, utilize um POJO que contem os metodos e os acessores.

O façade seria util se a sua lógica de negócio se extendesse por vários repositórios e serviços, provendo apenas um ponto de acesso para as camadas inferiores, porém sua aplicação acessa apenas um DAO, o que torna desnecessário o uso do façade.

Algumas referencias:



http://www.fragmental.com.br/wiki/index.php/Evitando_VOs_e_BOs

Abraços,

Obrigado pelas respostas pessoal.

Uma utilização bacana é criar fachadas para casos de uso mais trabalhosos como compras e vendas onde há muitos objetos envolvidos mas como uma única interface do ponto de vista do cliente do serviço. Para operações de manutenção de dados CRUD de cliente, fornecedor não vejo vantagem em utilizar esse padrão

Legal jMacaxera,

seu exemplo foi muito esclarecedor.

Estou lendo livro “Utilizando UML e Padrões” do Craig Larman e esclareci bastante sobre o assunto.

Ele comenta sobre o Facade que seria uma classe ou um pacote de classes para oferecer operações/métodos para a visão enxergar, fazendo essa ligação com o domínio e o banco de dados.

E após comentar sobre o Facade por si próprio ele comenta que em sistemas CRUD’s onde tem-se vários casos de uso, vários cadastros,podemos ter Controladores ou Facades de Sessao (SessionFacade) para cada CRUD, que seriam utilizados para fazer a ligação com as camadas mais inferiores e também para controlar valores da sessão.

Livro com leitura muitissima valiosa e interessante, recomendo a todos.

Um abraço.