Aplicando padrões de projeto

http://www.facensa.com.br/paginapessoal/daniel/files/lp2/WILDT_JAVAPATTERNS.pdf

Num tá muito boa essa definição nao…
Na verdade ele traduziu errado… a tradução correta da origem de onde ele copiou é:

Define uma interface para criar um objeto, mas deixa que as subclasses decidam qual classe instanciar.

ai, acho tão difíceis e chatas estas definições…pq não simplificam? né??

Eu conseguiria desfazer uma ação de excluir uma conta com o Command por exemplo??

Suportar ?undo? (desfazer). A operação Execute do Command pode armazenar o estado para reverter seus efeitos no próprio comando. A interface Command deve ter uma operação adicional ?Unexecute? que reverte os efeitos de uma chamada prévia para Execute.

Olá,

Olha primeiramente vou postar o seu código novamente, dei uma ajeitada pra ficar melhor :slight_smile: E aproveitei e fiz mais uma classe abaixo pra voce usar de comparação com o Singleton, acho até interessante mostra-la se quiser, se não fica a dica ai.

[code]package com.patterns.singleton;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**

  • Padrão de projeto aplicado:

  • Singleton: estabelece a regra de que só pode existir um objeto disponível

  • na memória para a classe que implementa este padrão.

  • Temos um objeto HibernateUtil já instanciado dentro da própria classe e

  • ninguem de fora consegue fazer um new() dessa classe, ou seja o

  • construtor private é essencial para se ter um Singleton, pois impede a instanciação da classe.
    */
    public final class HibernateUtil {

    private static final HibernateUtil INSTANCE = new HibernateUtil();
    private static final EntityManagerFactory factory = Persistence.createEntityManagerFactory(“ContasPU”);

    // construtor privado impede a instanciação pelos clientes
    private HibernateUtil() {}

    // retorna o objeto HibernateUtil estático
    public static HibernateUtil getInstance() {
    return INSTANCE;
    }

    public EntityManager getEntityManager() {
    return factory.createEntityManager();
    }
    }

/**

  • Uso de classe totalmente static comparada com o padrão Singleton. (Static vc Singleton)
  • Em termos de uso e de alocação de memória da exatamente na mesma.
  • A diferença é que o exemplo acima com o uso de Singleton torna o uso mais elegante
  • por estar aplicando OOP, ou seja através do uso de objetos.
  • Apenas é demonstrado que com uma classe totalmente static pode se conseguir o mesmo
  • efeito de uma classe Singleton.
    */

final class HibernateUtil2 {

private static final EntityManagerFactory factory = Persistence.createEntityManagerFactory("ContasPU");  

// construtor privado impede a instanciação  
private HibernateUtil2() {}  

public static EntityManager getEntityManager() {  
   return factory.createEntityManager();  
}  

}
[/code]

Em relação ao padrão Command o que voce entendeu sobre ele até agora? pra que serve exatamente ele?

Abraços,
Daniel

O Command… mesmo sem a implementação do undo… ainda é um command…

ele transformação uma requisição em um objeto. Este objeto pode ser armazenado e distribuído como qualquer outro objeto, tem que ter uma classe abstrata Command, que declara uma interface para execução dos métodos …não muito…não to conseguindo enxergar aonde eu posso encaixar estes padrões no sistema de contas…acho que este é o problema maior…

pode ser a hr…

e ele define um comando a ser executado. Ele permite que um um comando seja encapsulado de modo que ele possa ser utilizado entre vários objetos.

Não é que transforma a requisição em um objeto…

O Command é uma classe que encapsula uma solicitação, por exemplo : Imagine que voce tenha uma botão de adicionar, voce então cria uma AdicionarCommand que vai representar a ação que será feita através dessa solicitação que veio de sua página, no caso do seu .jsp, ententeu?

Segue um material legal de referencia : http://www.dsc.ufcg.edu.br/~jacques/cursos/map/html/pat/command.htm

Abraços
Daniel

[leia o post abaixo primeiro]

Bem… cada command representa uma ação do seu sistema…

Então você terá um InsertCommand, um UpdateCommand, DeleteCommand… etc…

Cada Command, pode ter um nome… Você cria uma lista desses commands… e passa para algum objeto que irá mostrar ao usuário quais opcoes ele tem (de acordo com um atributo da classe command que dá um nome para a acao)

O usuário esolhe qual command ele quer executar… e então você chama o método execute do command escolhido… que irá executar a tarefa…

Num sei é se deu pra entender… tentei resumir… :smiley:

Acho que mais resumido fica melhor…

Bem… cada command representa uma ação do seu sistema…

Então você terá um InsertCommand, um UpdateCommand, DeleteCommand… etc…

Você cria uma lista desses commands (um de cada tipo)… e mostra ao usuário quais opcoes ele tem

O usuário esolhe qual command ele quer executar… e então você chama o método execute do command escolhido… que irá executar a tarefa…

auhauhauaha…que loucuura…o resumo do resumo do resumo…eu começo criando um arquivo Command pra cada ação então?? E uma interface command (primeiro)…

Daniel!! É o mesmo material que eu já estava olhando…bom mesmo…obrigada

Esse material é ótimo mesmo.

Bem acho que vou nessa… até mais e boa sorte com os padrões :slight_smile:

De qualquer forma antes de ir deixo minha sugestão para seu terceiro e ultimo padrão que precisa… o padrão DAO (Data Acess Objet).

Obs: Como voce vai acessar um banco de dados por causa do Hibernate esse padrão vai cair como uma luva pra voce :slight_smile:

Abraços
Daniel.

Para o comand, inicialmente voce cria uma interface:

interface Command {

     String getName();
     void execute();
}

Aí você cria uma classe que implementa Command que executa determinada ação no sistema:

public class AdicionarUsuario implements Command{
      public String getName(){ return "Adicionar Usuario";}
      public void execute(){
             System.out.println("Digite o nome do usuario: ");
             String nome = readLine(); //essa funcao readLine lê uma linha do console.. uma funçao que eu criei aqui.. se quiser fazer igual terá que implementar
             System.out.println("Digite a senha do usuario: ");          
             String senha = readLine(); //essa funcao readLine lê uma linha do console.. uma funçao que eu criei aqui.. se quiser fazer igual terá que implementar
             Usuario usuario = new Usuario();
             usuario.setNome(nome);
             usuario.setSenha(senha);
             HibernateUtil.getInstance().getManager().persist(usuario); //nao sei qual é o nome do método aqui que tem que chamar para persistir pq nao uso JPA
      }
}

E você cria uma classe que implementa Command para cada possível operacao do seu sistema…

Faz uma forma de menu… que exiba todas as funcoes possíveis para que o usuário escolha de alguma forma

O usuário escolhe e então vc chama o execute()… que efetua a operacao…

Isso foi só um exemplo do que é um command… nao necessariamente precisa implementar assim…

é fácil, mass é difícil…eu me atrapalho td…

Todas as minhas ações estão nos arquivos jsp…separei elas em editar.jsp, inserir.jsp, excluir.jsp e listar.jsp…isso pq na primeira etapa do trabalho que não exigia usar padrões eu achei mais fácil pois dava conflito entre elas por usarem o id cm parâmetro…e eu uso o manager para fazer a transação e persistir, etc…bom …vou colar meu método inserir e se puder me aponte nele como seria, que eu acredito que vou entender melhor…e o menu que tu diz, pode ser qualquer menu?? eu tenho um no cabeçalho, simples, só pra apontar as ações mesmo…poderia ser este?? bom…lá vai

inserir.jsp

 //Objeto HibernateUtil 
    EntityManager manager = HibernateUtil.getInstance().getManager();

    Contas contas = new Contas();

    if (request.getParameter("id") != null) {
        contas = manager.find(Contas.class, Integer.parseInt(request.getParameter("id")));
    }

    if (request.getMethod().equals("POST")) {
        contas.setDescricao(request.getParameter("descricao"));
        contas.setTipo(request.getParameter("tipo").charAt(0));
        try {
            contas.setDt_baixa(DateFormat.getDateInstance().parse(request.getParameter("dt_baixa")));
            contas.setDt_lancamento(DateFormat.getDateInstance().parse(request.getParameter("dt_lancamento")));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro" + e);
        }
        contas.setValor(Double.parseDouble((request.getParameter("valor"))));



        manager.getTransaction().begin();
        manager.persist(contas);
        manager.getTransaction().commit();
    }


%>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Gerenciar Contas</title>
    </head>
    <body style="color: cornsilk">
        <p> <%@ include file="cabecalho.jsp" %></p>
        <p align="center">Lista de Contas</p>
        <table border="1" align="center">
            <thead>
                <tr>
                    <th>Id</th>
                    <th>Descrição</th>
                    <th>Dt Lançamento</th>
                    <th>Dt Baixa</th>
                    <th>Tipo</th>
                    <th>Valor</th>
                </tr>
            </thead>
            <tbody>
                <%
                    Query query = manager.createQuery("select c from Contas c");// vai recuperar coleção de objeto

                    ArrayList<Contas> lista = (ArrayList<Contas>) query.getResultList();
                    for (Contas conta : lista) {


                %>

                <tr>
                    <td><%= conta.getId()%></td>
                    <td><%= conta.getDescricao()%></td>
                    <td><%= conta.getDt_lancamento()%></td>
                    <td><%= conta.getDt_baixa()%></td>
                    <td><%= conta.getTipo()%></td>
                    <td><%= conta.getValor()%></td>
                    <td> <a style="text-decoration: none; color: aliceblue" href="editar.jsp?id=<%=conta.getId()%>">Editar</a></td>


                </tr>
                <%  }

                    contas = new Contas();
                    manager.close();

                %>
            </tbody>
        </table>
        <br>
        <form name="formulario" method="POST">
            <table width="264" border="0" align="center" cellpadding="0" cellspacing="5">
                <tr>
                    <td height="49" colspan="2" class="FORMULARIO" ><p align="center">Adicionar Conta</p></td>
                </tr>
                <tr>
                    <td width="104" class="FORMULARIO">Descrição:</td>
                    <td width="144" class="FORMULARIO"><input type="text" name="descricao" value="<%= contas.getDescricao()%>" /></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">Tipo:</td>
                    <td class="FORMULARIO"><select name="tipo">
                            <option value="E">Pagar</option>
                            <option value="R">Receber</option>
                        </select></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">Data de Lançamento:</td>
                    <td class="FORMULARIO"><input type="text" name="dt_lancamento" value="<%= contas.getDt_lancamento()%>" /></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">Data de Baixa:</td>
                    <td class="FORMULARIO"><input type="text" name="dt_baixa" value="<%= contas.getDt_baixa()%>" /></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">Valor:</td>
                    <td class="FORMULARIO"><input type="text" name="valor" value="<%= contas.getValor()%>" /></td>
                </tr>
                <tr>
                    <td class="FORMULARIO">&nbsp;</td>
                    <td class="FORMULARIO">
                        <input type="submit" value="Enviar" name="enviar" />
                    </td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                    <td>&nbsp;</td>
                </tr>
                <tr>
                    <td>&nbsp;</td>
                </tr>
            </table>
        </form>
        <center> <a style="text-decoration: none; color: aliceblue" href="index.jsp">>>Voltar para página principal</a></center>

        <p> <%@ include file="rodape.jsp" %></p>

cabecalho.jsp

<%-- 
    Document   : cabecalho
    Created on : 14/04/2011, 22:53:23
    Author     : SONY
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <link type="text/css" href="css/jquery.css" rel="stylesheet" />
        <script type="text/javascript" src="js/jquery.js"></script>
        <script type="text/javascript" src="js/jquery.ui.datepicker-pt-BR"></script>
    </head>

    <body>
        <p align="center"><strong>GERENCIAMENTO DE CONTAS</strong><br /><br />
        <a style="text-decoration: none; color: aliceblue" href="index.jsp" >Página Principal</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
        <a style="text-decoration: none; color: aliceblue" href="inserir.jsp" >Inserir Conta</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
        <a style="text-decoration: none; color: aliceblue" href="listar.jsp" >Listar Contas</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
        <a style="text-decoration: none; color: aliceblue" href="excluir.jsp" >Excluir Contas</a>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;
        <a style="text-decoration: none; color: aliceblue" href="editar.jsp" >Editar Contas</a><br /><br />
<br />
<br />
            <img src="imagens/top_pag_conta.jpg" id="bgimg"></p>
    </body>
</html>

Hummm… como seu projeto é web… complica um bocado usar o command… seriam necessárias muitas estruturas…

Faz o DAO primeiro… que acho que será mais fácil…

ehehehe…taa…valeu…até depois, com certeza…pq to devagar hj…

Vou olhar um padrao ali mais fácil de aplicar no seu sistema web…

Por enquanto faz o DAO… que é bem fácil…

O DAO é simplesmente uma classe que contém as suas consultas ao banco de dados…

Uma DAO para cada entidade

eu só tenho a entidade contas…então só faço um dao p ela né? com tds os métodos lá?? ai posso tirar os métodos de dentro dos jsp e só fazer uma chamada por um objeto dao?

isso… vc pode fazer o seu DAO ser um singleton tb… só pra enfeitar…