Вы находитесь на странице: 1из 17

MVC com Java e desktop

Publicado em 09/07/2012

Introduo
Nesse artigo iremos abordar um padro de projeto muito
interessante, o MVC (Model, View, Controller). Quem
nunca criou um "sistema-linguia", aquele que tem meia
duzia de arquivos e cada arquivo faz tudo, processa,
acessa banco, mostra resultados na tela e estoura pipoca,
que atire a primeira pedra! muito comum fazermos
esse tipo de programao quando estamos comeando a
desenvolver, geralmente so classes Bom-Bril, mil e
uma utilidades, todas amarradas com scripts SQL
misturados com tomadas de decises e apresentaes
grficas, um caos na hora de dar manuteno, parece um
castelo de cartas. Tudo bem, e o que o MVC tem a ver
com isso? O qu? Eu te explico!
Segundo Erich Gamma, "A abordagem MVC separa Viso
e Modelos pelo estabelecimento de um protocolo do tipo
insero/notificao (subscribe/notify) entre eles. Uma
viso deve garantir que a sua aparncia reflita o estado
do modelo"
O padro MVC coloca ordem nisso tudo, estipulando
regras de separao do cdigo de acordo com as
funcionalidades, distribuindo a aplicao em camadas e
fazendo com que elas sejam o mais independente
possvel umas das outras.

Exemplo modular
Por exemplo, voc pode fazer uma aplicao que se
baseia em: receber um valor, processar e retornar uma
resposta, sem salvar nada em banco de dados nem exibir
graficamente. Agora imagine que voc resolva acoplar a
esse sistema um modulo que salve no banco de dados o
resultado do processo e depois outro mdulo para exibir
o resultado com interface grfica. Se isso no for bem
estruturado, pode lhe dar uma tremenda dor de cabea

para implementar e outra maior ainda para dar


manuteno.

Analogia com o mundo real


Uma analogia do MVC com o mundo real poderia ser o
funcionamento de um carro. No carro temos o motor que
faz o processo principal, gerar fora mecanica. Temos
tambm os pedais e cmbio de marchas. Alm disso,
temos o painel de controle do carro que exibe
informaes de como est o seu funcionamento, como
temperatura, presso do leo e medidor de rotao do
motor.
Colocando o exemplo do carro no padro MVC temos a
seguinte estrutura:
O motor do carro certamente a camada model, pois se
trata do ncleo da aplicao (carro), exercendo o maior
trabalho. Os pedais, cambio e painel fazem parte da
camada view, embora o painel seja diferente dos pedais
e cmbio j que responsvel em exibir dados e os
outros em colher dados (interao com o usurio).
Agora imagine, j temos o motor e os elementos de
interao com o usurio mas est faltando algo. Se no
houvesse nada entre esses elementos e o motor, nada
aconteceria, voc poderia pisar o quanto quisesse no
acelerador, trocar qualquer marcha que nada aconteceria,
o painel seria apenas um monte de ponteiros e luzes que
no funcionariam para nada. nesse ponto que entra a
camada de controller. Essa camada corresponderia aos
sensores de temperatura, de rotao do motor e de
presso do leo do motor, responsaveis em fazer a
interao entre a camada model e a view, fazendo com
que a presso exercida nos pedais interfira no
funcionamento do motor e que o painel mostre o estado
do motor.

Estrutura MVC
A estrutura bsica do MVC a seguinte:

Model

Value Object

Business Object

Data Access Object

View

Controller

Esquema MVC

Se voc encontrar outras estrutura MVC's diferentes


mundo a fora, no se assuste, afinal de contas futebol,
religio e MVC so difceis de se encontrar o melhor e o
pior.
Na prxima parte do artigo iremos por a mo na massa e
desenvolver um "pequeno" sistema que ir usar todas as
camadas faladas aqui, alm de explicar a fundo a
camada model e suas integrantes.

Camada model
Explicado todos esses conceitos, vamos agora falar da
principal camada da aplicacao, a camadamodel. Como
vimos anteriormente, ela dividida em trs tipos de
classes, As Value Objects,Business Object e Data Access
Object. Sua funo prover todas as funcionalidades do
software independente de interao com o usurio ou
parte grfica.

Value Objects (VO)


Os objetos de valores (Values Objects) so classes que
contm variveis e metodos de acessos, alm de

construtores. Um exemplo desse tipo de classe seria


assim:
01

package br.com.gqferreira;

02
03
04

public class Pessoa {


//Variaveis

05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

private String cpf;


private String nome;
//Construtor
public Pessoa(String cpf, String nome) {
this.cpf = cpf;
this.nome = nome;
}
//Get and Set
public String getCpf() {
return cpf;
}
public void setCpf(String cpf) {
this.cpf = cpf;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
}

Objetos de valor tem a funo de modelar uma entidade,


uma abstrao do mundo real. Por exemplo a classe
pessoa, precisa conter todos os atributos que lhe
interessar a respeito de uma pessoa. Esse tipo de classe
muito utilizado para representar uma tabela do banco
de dados, por exemplo, se voc tiver uma tabela de
cliente, precisar de uma classe desse tipo com os
mesmos atributos que contm na tabela do banco de
dados. muito mais organizado e reutilizvel trafegar
todos os atributos encapsulados dentro de um objeto do
que passar uma "enchorrada" de variveis de um canto
ao outro.
Os metodos de acesso (Get and Set) servem para
garantir uma flexibilidade na hora de impor alguma regra

no acesso aos atributos, embora voc talvz nunca


utilize-os. Por exemplo, digamos que hoje o
mtodo getNome() apenas retorne o valor da varivel
nome e exibido na tela. Derrepente voc decidiu que
todo mundo ter o ttulo de Sr. e quer implementar essa
regra, basta ir ao mtodogetNome() e mudar o retorno
assim:
1
2
3

public String getNome() {


return "Sr. "+nome;
}

Pronto, voc acaba de impor uma regra no acesso ao


atributo nome e poder fazer isso em qualquer outro
mtodo.
Voc pode dar o nome que quiser para seus mtodos de acesso atributos, poderia
serobtemNome() e defineNome() que iria funcionar do mesmo jeito, porm existe uma
padronizao em utilizar os prefixos get e set.

Com o uso do construtor fica mais "elegante" criar um


objeto, por exemplo, em qualquer lugar que precisar de
uma instncia de Pessoa, basta fazer assim:
1 Pessoa p = new Pessoa("430.376.565-14", "Joaquim da silva");

Dessa forma voc ter um objeto da classe Pessoa com


todos os atributos j com valores definidos e poder
acess-los a qualquer momento a partir dos metodos de
acesso.
1 Pessoa p = new Pessoa("430.376.565-14", "Joaquim da silva");
2 System.out.println(p.getNome());

Isso imprimiria no console o nome da pessoa.

Data Access Object (DAO)


As classes do tipo DAO so encarregadas de fazer
o acesso dados, seja eles em um fluxo de rede,
arquivo ou banco de dados. Por exemplo, mtodos
responsveis em fazer acesso ao banco de dados devem
estar nesse tipo de classe, assim como mtodos que
manipulam arquivos ou que enviam e recebem dados
pela rede. Lembre-se, entrada e sada de dados!

Business Object (BO)


Esse tipo de classe tambm compem a model da
aplicao, assim como os dois tipos de classe ditos

anteriormente. A especialidade das classes BO's


resolver operaes complexas, so os processos
principais da aplicao, digamos que o "miolo" do
software. Nessas classes so processadas regras de
negcio e tomadas de deciso.

Outro projeto

Java - Criando uma aplicao em 3 camadas (MVC)


O passo a passo para a criao de uma aplicao usando Java, com
Banco de Dados (BD) chamado H2 na estrutura MVC (Modelo, Viso e
Controle).
Ser um exemplo com uma nica classe sendo armazenada no BD.

Para os cdigos que seguem abaixo, em todas as classes deve-se incluir


o package correto e adicionar os imports necessrios. Observe a diviso
abaixo:

1gui(Viso)
LoginGUI
ApiculturaGUI
ClienteGUI
controller(Controle)
ApiculturaController
IncluirClienteController
persistncia(Modelo)
ClienteDAO
FactoryConnection
dominio(Modelo)
Cliente

A primeira classe contm o famoso psvm (public static void main), que
inicia a execuo da aplicao:

1
publicclassApicultura{
publicstaticvoidmain(String[]args){
ApiculturaControllerapp=newApiculturaController();
}
}

A classe ApiculturaController.java controla a janela de Login e a que


contm o Menu.
Se o usurio acertar a senha, que nica, a janela com menu ser
apresentada, caso contrrio a aplicao finalizada.
So instanciadas as classes com a interface grfica e aqui so tratados
os eventos.

1
publicclassApiculturaController{
privateApiculturaGUIgui=null;
privateLoginGUIguiLog=null;

publicApiculturaController(){
guiLog=newLoginGUI();
guiLog.adicionarOuvinteLogin(newOuvinteLogin());
}

classOuvinteLoginimplementsActionListener{
publicvoidactionPerformed(ActionEventev){
if(ev.getActionCommand()=="OK"){
Stringsenha=
String.valueOf(guiLog.pfSenha.getPassword());
if(senha.compareTo("SENHA")==0){
guiLog.dispose();//fechaajanela
delogin
gui=newApiculturaGUI();
gui.adicionarOuvinte(newOuvinteIncluir());
}

else{
JOptionPane.showMessageDialog(null,"Senha
Invlida!");
System.exit(0);
}
}
elseSystem.exit(0);
}
}
classOuvinteIncluirimplementsActionListener{
publicvoidactionPerformed(ActionEventev){
Objectfonte=ev.getSource();
if(ev.getSource()instanceofJMenuItem){
if(fonte==gui.mcSair){
System.exit(0);
}
else
if(fonte==gui.mcCadastro){
IncluirClienteController
clienteController=
new
IncluirClienteController();

gui.desktop.add(clienteController.guiCli);
}
}
}
}
}

A classe LoginGUI.java deve conter os componentes em seu mtodo


construtor e a adio dos eventos, que so tratados na classe de
controle (ApiculturaController.java).

1
publicclassLoginGUIextendsJFrame{
//declararoscomponentesaquicomopublic
publicLoginGUI(){

//tratarapartegrficaaqui
}

publicvoidadicionarOuvinteLogin(ActionListenerouvinte)
{
this.btOK.addActionListener(ouvinte);
this.btCancelar.addActionListener(ouvinte);
}
}
Um exemplo para a interface grfica de Login a seguinte:

A classe ApiculturaGUI.java a que contm o menu, usando as classes


DesktopPane e JInternalFrame. Observe a implementao:

1
publicclassApiculturaGUIextendsJFrame{
publicJDesktopPanedesktop;
publicJMenuBarbarraDeMenu;
publicJMenuItemmcCadastro,mpCadastro,mcSair,miSobre;

publicApiculturaGUI(){
this.setTitle("SistemadeControledeProduo
Apcula");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
barraDeMenu=criaMenu();
this.setJMenuBar(barraDeMenu);
desktop=newJDesktopPane();
this.setContentPane(desktop);
this.setVisible(true);
}

publicJMenuBarcriaMenu(){

//crieseumenucomoscomponentesJMenu,JMenuBare
JMenuItem
}

publicvoidadicionarOuvinte(ActionListenerouvinte){
this.mcCadastro.addActionListener(ouvinte);
this.mcSair.addActionListener(ouvinte);
}
}
Como aconteceu na classe LoginGUI.java, a classe ApiculturaGUI deve
conter os componentes para a criao do menu em seu mtodo
construtor e a adio dos eventos, que so tratados na classe de
controle (ApiculturaController.java).
Veja como fica o Front-end da aplicao:

Observe que o JPanel contm uma imagem de fundo. Para maiores


detalhes, acesse a explicaoclicando aqui.

A prxima classe a IncluirClienteController.java que chama a interface

grfica para a classe Cliente e trata os eventos que sero adicionados


pela classe ClienteGUI.java.

1
publicclassIncluirClienteController{
publicClienteGUIguiCli;

publicIncluirClienteController(){
guiCli=newClienteGUI();

guiCli.adicionarOuvinteCliente1(new
OuvinteIncluirCliente1());
}

classOuvinteIncluirCliente1implementsActionListener{
publicvoidactionPerformed(ActionEventev){
Objectfonte=ev.getSource();
if(fonte==guiCli.bSaiCli)
guiCli.dispose();
elseif(fonte==guiCli.bLimCli)
guiCli.limparCampos();
elseif(fonte==guiCli.bExcCli){
ClienteDAOclienteDAO=newClienteDAO();

clienteDAO.excluirCliente(guiCli.tfcodcli.getText());
guiCli.limparCampos();
}
elseif(fonte==guiCli.bConCli){
ClienteDAOclienteDAO=newClienteDAO();
Clientecliente=
clienteDAO.consultarCliente();
if(cliente!=null)
mostrarCliente(cliente);
}
elseif(fonte==guiCli.bIncCli){
ClienteDAOclienteDAO=newClienteDAO();
Clientecliente=obterCliente();
clienteDAO.incluirCliente(cliente);
guiCli.limparCampos();
}
elseif(fonte==guiCli.bAltCli)
ClienteDAOclienteDAO=newClienteDAO();

Clientecliente=obterCliente();
clienteDAO.alterarCliente(cliente);
}
}
}
}
publicClienteobterCliente(){
Clientecliente=newCliente();
//Aquideveseobtertodososdadoscontidosnos
componentes
//epreencheroobjetocliente.
//Exemplo:
cliente.setNomCli(guiCli.tfnomcli.getText());
returncliente;
}
publicvoidmostrarCliente(Clientecliente){
//Aquideveseobtertodososdadoscontidosnoobjeto
cliente
//epreencheroscomponentesdainterfacegrfica
//Exemplo:
guiCli.tfnomcli.setText(cliente.getNomCli());
}
}

A classe ClienteGUI.java contm apresentao da interface grfica para


tratar os dados do Cliente.
Veja o exemplo:

Veja o trecho do cdigo:

1
publicclassClienteGUIextendsJInternalFrame{
//declararoscomponentesdainterface
publicClienteGUI(){
//criarainterfacegrfica
}
publicvoidadicionarOuvinteCliente1(ActionListener
ouvinte){
//adicionarosouvintesaosbotes
//Ex.:this.bIncCli.addActionListener(ouvinte);
}
publicvoidlimparCampos(){
//comandosparalimparoscomponentes

}
}
O menu est no JDesktopPane e as demais janelas sero JInternalFrame.

A classe que controla Cliente (IncluirClienteController.java) tambm


precisa da classe Cliente.java que tem a definio dos atributos e dos
mtodos acessores (get) e modificadores (set).
Veja parte do cdigo:

1
publicclassCliente{
//declaretodososatributoscomoprivate
privateintcodcli;
privateStringnomcli;
publicCliente(){
super();
}
publicCliente(intcodcli,Stringnomcli){
super();
this.codcli=codcli;
this.nomcli=nomcli;
}

publicintgetCodCli(){
returnthis.codcli;
}

publicStringgetNomCli(){
returnthis.nomcli;
}
publicvoidsetCodCli(intcodcli){
this.codcli=codcli;
}

publicvoidsetNomCli(Stringnomcli){
this.nomcli=nomcli;

}
}

A classe ClienteDAO.java (Data Access Object) trata das rotinas de


incluso, excluso, alterao e consulta, ou seja, trabalha diretamente
com a fonte de dados (o BD). Todos os seus mtodos realizaro a
conexo com o Banco de Dados, sendo assim, precisam instanciar um
objeto da classe FactoryConnection.java.
Ex.: Connection con = FactoryConnection.getConnection();

1
publicclassClienteDAO{
publicvoidincluirCliente(Clientecliente){
//tratarincluso
}

publicClienteconsultarCliente(){
//tratarconsulta
returncliente;
}

publicvoidalterarCliente(Clientecliente){
//trataralterao
}
publicvoidexcluirCliente(Stringstrcod){
//tratarexcluso
}
}
Para maiores detalhes, clique aqui e acesse o Frum Programao Java Dicas que contm detalhes da classe ClienteDAO.

A classe FactoryConnection apresenta a conexo com o Banco de Dados,


que neste exemplo ser o H2.

1
publicclassFactoryConnection{

publicstaticConnectiongetConnection(){
Connectioncon=null;
try{
Class.forName("org.h2.Driver");
Stringurl=
"jdbc:h2:tcp://localhost:9092/C:/DB/Banco";
Stringuser="admin";
Stringpassword="senha";
con=DriverManager.getConnection(url,user,
password);
}catch(Exceptione){
e.printStackTrace();
}
returncon;
}
}
Trabalhando dessa forma, suas classes ficam menores e bem dividas por
assunto!
O cdigos foram didaticamente apresentados! Portanto, use sua
criatividade e melhore-os!

Вам также может понравиться