Escolar Documentos
Profissional Documentos
Cultura Documentos
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
Estrutura MVC
A estrutura bsica do MVC a seguinte:
Model
Value Object
Business Object
View
Controller
Esquema MVC
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.
package br.com.gqferreira;
02
03
04
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
Outro projeto
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();
}
}
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);
}
}
}
}
}
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:
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:
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());
}
}
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.
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;
}
}
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.
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!