MVC com Command Pattern é possível?

Fala pessoal blz?

Sou novo no fórum e em Java…

Estou desenvolvendo minha segunda aplicação em java web e estou tentando utiizar MVC e analisando patterns interessante pra deixar a APP robusta…
estava lendo sobre Command Pattern e achei bem interessante, alias achei aqui um documento bacana sobre o assunto http://www.scribd.com/doc/37639275/PadroesProjetoJEE

Ainda estou tentando entender bem o Command Pattern, mas me pareceu interessante e o pouco que compreendi percebi q pode ser utilizado com MVC. Compreendi errado ?

Hoje minha aplicação esta mais ou menos assim:

CLIENTE >> SERVLET FRONT END >> (CLASSE MODELO) (CLASSE COM QUERYS)

e na parte administrativa

CLIENTE >> SERVLET BACK END >> (CLASSE MODELO) (CLASSE COM QUERYS)

só que nessa situação

estou tendo um SERVLET centralizador (melhor 2, servlet backend e frontend)

que redirecionam para um servlet para cada MODELO, por exemplo:

form cadUsuario >> ServletFrontEnd >> Servlet cadUsuario >> Model Usuario (metodo salvarUsuario)

o problema é q dessa maneira meu sistema vai crescer sempre tendo que criar um novo servlet para cada novo modelo, lendo sobre command pattern m pareceu que ele resolveria esse problema…

vcs poderiam me dar um exemplo de código ou algum artigo que exemplifique de preferencia de forma simples a utilização de um command pattern com MVC ?

abcs e obrigado

estudando um pouco melhor acho q o que estou procurando fazer seria um FACTORY METHOD…

estou tentando fazer o factory method, mas to tendo o seguinte erro: [color=red]DI.Conta.Conta_DLO is not abstract and does not override abstract method listar() in DI.Controller.IDados[/color] na classe Conta_DLO que implementa a interface… imaginei q teria q usar override em cada metodo q esta como assinatura na interface, porém acho q o java nao reconhece override…

[code]public interface IDados {

public void gravar();
public void alterar();
public void excluir();
public Object consultar();
public List<Object> listar();

}[/code]

[code]public class Conta_DLO implements IDados {

public void gravar(Conta c) throws Exception //throws Exception = try e catch
{

    Dao.open();

    String sql = "";

    Dao.stmt = Dao.con.prepareStatement(sql);

    Dao.stmt.setString(1, "teste");

    Dao.stmt.executeUpdate();

    Dao.stmt.close();

    Dao.close();

}

public void alterar(Conta c) throws Exception //throws Exception = try e catch
{

}

public void excluir(Conta c) throws Exception //throws Exception = try e catch
{

}

public Conta consultar(Conta c) throws Exception //throws Exception = try e catch
{
    Conta conta = new Conta();
    return conta;
}

public List<Conta> listar() throws Exception //throws Exception = try e catch
{

}

[/code]

public class DadosFactory { public static IDados getDados(String tipoDado){ if( tipoDado == null ) return null; else if( tipoDado.equals("conta") ) return new Conta_DLO(); else return null; } }

Olá Amigo.

espero que não leve mal o que irei dizer.

Olhei o seu código fonte e notei que falta em você
noções de Orientação à objetos.

É elogiável você estar querendo aprender padrões de projeto, mas te diria
para aprender isso depois de ter um base sólida de conhecimento em Orientação à objetos.

Se você implementa uma interface, DEVE sobrescrever os métodos exatamente com os mesmos números de parametros,
nesse caso nenhum, pois a interface não defini parametros nos métodos.

Isso é algo extremamente básico, e por isso volto a dizer, estude OO, polimorfismo, sobrescrita, sobrecarga, herança,
aprender a linguagem java, algumas APIs, para assim voltar e estudar design patterns.

Somente depois disso você terá o conhecimento necessário para aprender Abstract Factory, Method Factory, Singleton,
e vários outros patterns…

Respondendo a sua pergunta original agora: Todo Front Controller que utiliza o MVC utiliza o padrão command internamente.
Mas isso é algo interno do framework.

É isso, boa sorte nos estudos.

Entendo que meu conhecimento sobre OO é basico e estudar pattern na verdade esta me ajudando bastante a entender de forma pratica e util a utilização do OO no dia a dia, acho mais facil dessa maneira do q exemplos nao aplicaveis como CACHORRO HERDA DE MAMIFERO etc…

como falei no topico eu tentei sobrecarregar meus metodos q estao como assinatura na interface, mas o overrider no java nao parece reconhecer…

e o detalhe das assinaturas dos metodos me passou desapercebido, fiz muitos testes e acabei postando a versao errada da classe Conta_DLO… na verdade ja testei sem parametros como na interface, mas continua a mesma coisa.

se alguem puder me dar uma luz agradeço…

Segue classe atualizada…
como faço o override por exemplo ? ja teste @Override acima dos metodos, mas nao funciona… e o erro continua o mesmo…

[code]public class Conta_DLO implements IDados {

public void gravar() throws Exception //throws Exception = try e catch
{

    Dao.open();

    String sql = "";

    Dao.stmt = Dao.con.prepareStatement(sql);

    Dao.stmt.setString(1, "teste");

    Dao.stmt.executeUpdate();

    Dao.stmt.close();

    Dao.close();

}

public void alterar() throws Exception //throws Exception = try e catch
{

}

public void excluir() throws Exception //throws Exception = try e catch
{

}

public Object consultar() throws Exception //throws Exception = try e catch
{

}

public List<Object> listar() throws Exception //throws Exception = try e catch
{

}[/code]

Ok.

Poste o código das suas classes.

Design patterns não tem por objetivo ajudar a ensinar orientação à objetos.
Tem por objetivo melhorar a estrutura do programa onde somente o conhecimento da orientação à objetos
é insuficiente para resolver o problema elegantemente.

Existe uma regra na OO em java
que defini :

Se uma interface definir um método sem lançar exceção, e uma subclasse implementa tal interface,
logo o método na subclasse sobrescrito NÃO PODE definir uma exceção marcada.

Por essa razão seu código não funciona.

Olá,

não seria mais interessante vc focar em aprender algum framework web? Se vc aceita uma sugestão, q tal vRaptor ou PlayFramework?

Se o que você quer é aprender, abaixe o codigo fonte do seu framework escolhido e configure o eclipse para que seja possível você navegar em todo o src deste framework. Ou seja, resolva os problemas da forma que o framework sugere, mas explore o código fonte destes frameworks e encontre ali onde os patterns foram devidamente aplicados.

Se possível, use como base a apostila FJ-28 da Caelum (http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/)

Obrigado pela ajuda Jonny era exatamente esse o problema, coloquei throws Exception na interface ae passou a reconhecer o @Override
acredito q esse detalhe seja uma caracteristica do java, pois nao lembro ter passado algo semelhante com exceções em c# …

outra coisa, a unica forma de colocar override em java é com esse @override ?

Thiago obrigado pelas sugestões, farei isso em um outro momento, pois agora eu preciso focar no meu projeto final da faculdade (tenho prazo), escolhi java, pois queria aprofundar mais na linguagem e estou justamente no momento de pensar na arquitetura, por esse motivo tbm do estudo dos patterns… e apesar de nao parecer nao sou extremamente leigo no assunto, mas sim tenho muito a melhorar…

abcs e obrigado.

Então, falando em arquitetura, e respondendo a pergunta do tópico (que já foi respondida) SIM MVC e Command funcionam bem juntos.

Na verdade, uma coisa não é dependente da outra, e sobre essa afirmação:

Eu discordo parcialmente, pois já fiz uma aplicação (bem pequena, lógico, estava estudando ainda) que era estruturada em MVC, tinha Front Controller e não tinha o command pattern o0, mas também todos os frameworks de aplicação MVC que eu conheço tem internamente o command pattern (por exemplo o Struts2)

Uma boa organização do Controle da aplicação, seria um FrontController, que chama um command e um Factory para “escolher” qual command será chamado :smiley:

Ah e esse @override é mais uma anotação para alertar o seu colega desenvolvedor que está dando manutenção no código que o método está sendo sobrescrito. Essa anotação não é obrigatoria em Java, para sobrescrever um método em Java, basta que a classe filha implemente um método com a mesma assinatura que o método da classe mãe :stuck_out_tongue:

drigo angelo…

quando eu disse que todo o front controller utiliza o command eu me referi à um front controller PROFISSIONAL,
como o Struts por exemplo.

Mas em qualquer projeto a pessoa pode fazer um front controller ultra super mega simples e não utilizar nenhum padrão dentro,
pois por ser simples não precisa de um pattern.

e como funcionaria isso exatamente?

hoje estou planejando da seguinte maneira: (Factory Method)

hj encontro dois problemas na maneira q estou fazendo:

primeiro q nao vou coseguir eliminar os IFs por completo no frontcontroller, pois vou recuperar dados de formulários pra modelos diferentes. no meu exemplo uso o campo email para preencher o objeto conta, porém existirão: conta, anuncio, etc… pensei em criar um factory method especifico para os dados que recupero do formulario, ou utilizar o factory já existente, dentro do if q ja existe la…

o segundo problema é que ta complicado deixar a interface generica… estou colocando os parametros como OBJECT, porem vou precisar passar tipos de classes diferentes como parametro, exemplo: a interface tem na assinatura OBJECT pra ser generico, mas vou precisar passar: classe CONTA, ANUNCIO etc…

nao sei se fui claro, mas queria saber como ficaria esse modelo q vc citou…

como esta hoje:

FrontController:

[code]protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    try {

        Conta c = new Conta();

        c.setEmail(request.getParameter("email"));

        IDados dados = DadosFactory.getDados("conta");
        try{
            dados.gravar(c);
        }catch(Exception e){
            //
        }
    } finally { 
        out.close();
    }
} [/code]

Interface:

[code]public interface IDados {

public void gravar(Object o) throws Exception;
public void alterar(Object o) throws Exception;
public void excluir(Object o) throws Exception;
public Object consultar() throws Exception;
public List listar() throws Exception;

}[/code]

Modelo:

[code]public class Conta_DLO implements IDados {

@Override
public void gravar(Object c) throws Exception //throws Exception = try e catch
{

    Dao.open();

    String sql = "insert";

    Dao.stmt = Dao.con.prepareStatement(sql);

    Dao.stmt.setString(1, "teste");

    Dao.stmt.executeUpdate();

    Dao.stmt.close();

    Dao.close();

}

}[/code]

Fabrica:

public class DadosFactory { public static IDados getDados(String tipoDado){ if( tipoDado == null ) return null; else if( tipoDado.equals("conta") ) return new Conta_DLO(); else return null; } }

Olhei seu código e acho que você deveria dar uma olhada nesse link.

http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html

Aqui mostra o que é um FrontController.
Depois compare com o código que você criou.

Bons estudos. :wink:

johnny,

estudei aplicação do frontcontroller junto com command e factory deu pra entender bacana, achei bastante coisa sobre o assunto, mas faltava algumas coisas como exemplos de implementação pra entender com mais detahes, então comecei a pesquisar exemplos de códigos pelo google code search e achei bastante, desde coisas simples a coisas mais complexas, e tbm muitas implentações diferentes de como estava imaginando… então achei um exemplo bem simples com tudo que eu queria ver codificado, frontcontroller, command, factory e um requesthelper implementado…

ae queria ver com vcs o que acham do exemplo que achei, se ta seguindo os patterns corretamente e se da pra usa-lo como exemplo pra estudo…

http://www.google.com/codesearch/p?hl=en#hX2iAvQDQCs/trunk/5-Fontes/Calculo/Calculo-war/src/java/br/unibh/tcc/FrontControllerServlet.java&q=frontcontroller%20command%20requesthelper%20java&d=9

v q q vcs acham…

abçs

Veio você não deve sair usando patterns assim.
Você não programa para patterns, você programa para a solução de um negocio.
Padrões de projetos são soluções para problemas comuns que acontecem durante o desenvolvimento. Você deve conhecer tais problemas para saber quando utilizar.
Senão teu orientador já chega na voadora pra cima de ti.