Você está na página 1de 6

Introduo ao padro de projeto MVC Model-View-Controller

Miguel Jonathan IM/DCC e NCE UFRJ (junho de 2011)

Nesse texto introduzimos o padro MVC, com alguns exemplos simples: ideia ! di"idir uma aplicao em tr#s pacotes de classes: a$ model %modelo$: cont!m as classes &ue descre"em os o'jetos da aplicao, por exemplo, alunos, disciplinas, turmas, pro(essores, etc) '$ controller %controlador$: cada o'jeto controlador ! uma esp!cie de *gerente+ da aplicao, encarregado de intermediar as solicita,es dos usu-rios (eitas atra"!s da inter(ace com o usu-rio %"ista$) . controlador tem acesso aos o'jetos do modelo, /s estruturas de dados, e em'ute nos seus m!todos as *regras de neg0cio+ da aplicao) s regras de neg0cio cont#m a *l0gica da aplicao+: (iltros para controlar a criao de o'jetos e o acesso aos dados, "alores m-ximos e m1nimos aceit-"eis, etc) 2ma aplicao simples pode ter um s0 o'jeto controlador, mas se (or um sistema mais complexo pode pre(erir utilizar um controlador para cada su'sistema) . pacote de"e conter as classes controladoras, e tam'!m as classes &ue representam as exce,es &ue o controlador pode lanar, sempre &ue uma solicitao "iolar alguma das regras) 3m geral se utiliza o padro de projeto 45ingleton4 para garantir &ue sempre 6a"er- no m-ximo uma inst7ncia de cada controlador) Isso ! conseguido (azendo o construtor do controlador ser pri"ado) .s m!todos do controlador no de"em ser escritos com uma inter(ace espec1(ica com o usu-rio em mente) 5eus m!todos de"em rece'er argumentos e retornar "alores ou lanar exce,es) 8essa (orma, a aplicao (ica independente da inter(ace usada para acess--lo) c$ "iew %"ista, a inter(ace com o usu-rio$: este pacote cont!m as classes &ue (azem a interao com o usu-rio) 2ma aplicao pode utilizar mais de uma inter(ace di(erente, e pode trocar de inter(ace, sem &ue seja necess-rio inter(erir com o restante da aplicao) 9ara conseguir isso, a inter(ace captura as solicita,es do usu-rio e as con"erte em mensagens para o controlador) s exce,es lanadas pelo controlador so capturadas pelos m!todos da "ista, &ue geram as a,es correspondentes para repass--las ao usu-rio) 9ara poder (azer isso, cada "ista de"e ter acesso a o'jetos controladores) 3m resumo, o uso do padro MVC permite desacoplar a inter(ace da aplicao em si) inter(ace no con6ece a estrutura da aplicao, e a aplicao no depende de nen6uma inter(ace em particular) 2m sistema 'em desen6ado com MVC permite trocar de inter(ace mais (acilmente, assim como permite mudar a estrutura interna dos dados sem alterar a inter(ace com o usu-rio)

.s exemplos a'aixo ajudam a entender o mecanismo usado)

3xemplo :: MVC5imples5erializado Modelo: Neste exemplo, o pacote modelo tem apenas uma classe % luno$) Cada aluno tem s0 duas in(orma,es no seu estado: o nome %nome$ e o n;mero de registro %dre$) Controlador: . pacote contem apenas uma classe para o controle) classe s0 permite a criao de um ;nico o'jeto controlador, para isso utiliza o padro de projeto 5ingleton) . controlador permite a criao de alunos, e pode in(ormar o nome do aluno &ue possui um determinado n;mero de registro (ornecido) . controlador usa apenas uma *regra de neg0cio+: No pode 6a"er mais de um aluno com o mesmo n;mero de registro) . controlador mant!m na mem0ria %um <as6Map$ o cadastro dos alunos jcriados, e tam'!m pode sal"ar em disco e recuperar do disco os alunos &ue (oram criados em sess,es anteriores) 3ssa persist#ncia ! conseguida por meio de serializao do mapa) . controlador pode lanar dois tipos de exceo: - se (or solicitado &ue crie um aluno com n;mero de registro j- utilizado) - se (or solicitado o nome de um aluno para um n;mero de registro ainda no utilizado) Vista: . exemplo mostra uma "ista &ue utiliza uma inter(ace gr-(ica constru1da com 5wing) Nota &ue a "ista de"e inclui uma "ari-"el de inst7ncia &ue re(erencia uma inst7ncia do controlador) 3la traduz as solicita,es do usu-rio em mensagens para os m!todos do controlador) "ista tam'!m est- preparada para capturar as exce,es lanadas pelo controlador e traduzi-las em a"isos apropriados para o usu-rio) "ista j- inclui um m!todo main para lanar a aplicao) 5egue a'aixo o c0digo completo: 9acote modelo:
package modelo; public class Aluno implements java.io.Serializable{ private static final long serialVersionUID = 1L; private String dre; private String nome; public Aluno(String dre, String nome) { super(); this.dre = dre;

this.nome = nome; } public String getDre() { return dre; } public void setDre(String dre) { this.dre = dre; } public String get ome() { return nome; } public void set ome(String nome) { this.nome = nome; } }

9acote controle:
package !ontrolador; import import import import java.util."olle!tion; java.util.#as$%a&; java.io.'; modelo.Aluno;

public class "ontroladorAlunoSerializado { public static "ontroladorAlunoSerializado controladorAlunoSerializado = null; public static "ontroladorAlunoSerializado get"ontroladorAlunoSerializado(){ if (controladorAlunoSerializado==null)controladorAlunoSerializado = new "ontroladorAlunoSerializado(); return controladorAlunoSerializado; } #as$%a&(String, Aluno) alunos; private "ontroladorAlunoSerializado(){ alunos = new #as$%a&(String, Aluno)(); } public Aluno getAluno(String dre) throws Aluno*ne+istente,+!e&tion{ if (alunos.get(dre)== null)throw new Aluno*ne+istente,+!e&tion(dre); else return alunos.get(dre); } public void !riaAluno(String dre, String nome)throws DreDu&li!ado,+!e&tion{ if(alunos.get(dre)== null){ alunos.&ut(dre, new Aluno(dre, nome)); } else throw new DreDu&li!ado,+!e&tion(); } public "olle!tion(Aluno) getAlunos(){ return alunos.values(); } public void salvarAlunos()throws *-,+!e&tion{ .ile-ut&utStream /os = new .ile-ut&utStream(0alunos.ser0); -bje!t-ut&utStream oos = new -bje!t-ut&utStream(/os); oos.1rite-bje!t(alunos); oos.!lose(); } public void re!u&erarAlunos() throws *-,+!e&tion, "lass ot.ound,+!e&tion{ -bje!t*n&utStream ois = new -bje!t*n&utStream(new .ile*n&utStream(0alunos.ser0)); -bje!t objeto = ois.read-bje!t();

alunos = (#as$%a&(String, Aluno))objeto; } public void lim&arDados(){ 22 destroi todos os dados da mem3ria alunos = new #as$%a&(String, Aluno)(); } }

9acote "ista
package vista; import import import import import import import import import import import import import java.a1t.4orderLa5out; java.a1t..lo1La5out; java.a1t.6ridLa5out; java.a1t.event.A!tion,vent; java.a1t.event.A!tionListener; java.a1t.event.7e5Ada&ter; java.a1t.event.7e5,vent; java.io.*-,+!e&tion; java+.s1ing.84utton; java+.s1ing.8.rame; java+.s1ing.8Label; java+.s1ing.89anel; java+.s1ing.8:e+t.ield;

import !ontrolador.Aluno*ne+istente,+!e&tion; import !ontrolador."ontroladorAlunoSerializado; import !ontrolador.DreDu&li!ado,+!e&tion; public class 6uiSim&lesSalvando { private String dre, nome; private 8.rame janela; private 89anel &ainel6eral, &"entro, &Dis&la5, &Dre, & ome, &4otoes, &%ensagem; private 8Label labelDre, label ome, label%ensagem; private 84utton bot"riar, bot-bter ome, botSalvar, botLim&ar; private 8:e+t.ield t/Dre, t/ ome, t/%ensagem; private "ontroladorAlunoSerializado !ontrolador = "ontroladorAlunoSerializado.getControladorAlunoSerializado(); public 6uiSim&lesSalvando() { janela = new 8.rame(06;* Sim&les 9ersistente0); &ainel6eral = new 89anel(new 4orderLa5out()); &"entro = new 89anel(new 4orderLa5out()); &Dis&la5 = new 89anel(new 6ridLa5out(<,1)); &Dre = new 89anel(); & ome = new 89anel(); &Dre.setLa5out(new .lo1La5out(.lo1La5out.LEFT)); & ome.setLa5out(new .lo1La5out(.lo1La5out.LEFT)); &Dis&la5.add(&Dre); &Dis&la5.add(& ome); labelDre = new 8Label(0D=,> 0); &Dre.add(labelDre); t/Dre = new 8:e+t.ield(1?); t/Dre.add7e5Listener(new -uvinte:/Dre()); &Dre.add(t/Dre); label ome = new 8Label(0 ome> 0); & ome.add(label ome); t/ ome = new 8:e+t.ield(@?); & ome.add(t/ ome); &4otoes = new 89anel(); bot"riar = new 84utton(0"riar Aluno0); bot"riar.addA!tionListener(new -uvinte"riar()); &4otoes.add(bot"riar); bot-bter ome = new 84utton(0-bter nome0);

bot-bter ome.addA!tionListener(new -uvinte-bter ome()); &4otoes.add(bot-bter ome); botSalvar = new 84utton(0Salvar dados0); botSalvar.addA!tionListener(new -uvinteSalvar()); &4otoes.add(botSalvar); botLim&ar = new 84utton(0Lim&ar dados0); botLim&ar.addA!tionListener(new -uvinteLim&ar()); &4otoes.add(botLim&ar); &%ensagem = new 89anel(); label%ensagem = new 8Label(0%ensagem> 0); t/%ensagem = new 8:e+t.ield(A?); t/%ensagem.set,ditable(false); &%ensagem.add(label%ensagem); &%ensagem.add(t/%ensagem); &%ensagem.setLa5out(new .lo1La5out(.lo1La5out.LEFT)); &"entro.add(&Dis&la5, 4orderLa5out.CENTER); &"entro.add(&4otoes, 4orderLa5out.SOUTH); &ainel6eral.add(&"entro, 4orderLa5out.CENTER); &ainel6eral.add(&%ensagem, 4orderLa5out.SOUTH); janela.add(&ainel6eral); janela.set4ounds(?, ?, B??, A??); janela.setDe/ault"lose-&eration(8.rame.EXIT_ON_CLOSE); janela.setCisible(true); try{ !ontrolador.re!u&erarAlunos(); t/%ensagem.set:e+t(0-s dados dos alunos /oram re!u&erados do arDuivo0); } catch(*-,+!e&tion ioe){ t/%ensagem.set:e+t (0 Eo /oi &ossFvel re!u&erar os dados dos alunos> *-,+!e&tion0); } catch ("lass ot.ound,+!e&tion !n/){ t/%ensagem.set:e+t (0 Eo /oi &ossFvel re!u&erar os dados dos alunos> "lass ot.ound,+!e&tion0); } } class -uvinte:/Dre extends 7e5Ada&ter{ public void Ge5:5&ed(7e5,vent ev){ t/%ensagem.set:e+t(00); t/ ome.set:e+t(00); } } class -uvinte"riar implements A!tionListener { public void a!tion9er/ormed(A!tion,vent aev){ nome = t/ ome.get:e+t(); dre = t/Dre.get:e+t(); try{ !ontrolador.!riaAluno(dre, nome); t/%ensagem.set:e+t(0Aluno 0 H nome H 0 !riado -7, !om D=, 0 H dre); } catch(DreDu&li!ado,+!e&tion e+){ t/%ensagem.set:e+t (0 Eo /oi &ossFvel !riar o aluno. - D=, 0 H dre H 0 jI /oi alo!ado0); } } } class -uvinte-bter ome implements A!tionListener { public void a!tion9er/ormed(A!tion,vent aev){ dre = t/Dre.get:e+t(); try{ nome = !ontrolador.getAluno(dre).get ome();

t/%ensagem.set:e+t(0- aluno !om D=, = 0 H dre H 0 !$amaJse 0 H nome); } catch(Aluno*ne+istente,+!e&tion e+){ t/%ensagem.set:e+t(0 Eo e+iste aluno !om D=, = 0 H dre); } } } class -uvinteSalvar implements A!tionListener{ public void a!tion9er/ormed(A!tion,vent aev){ try{ !ontrolador.salvarAlunos(); t/%ensagem.set:e+t(0Dados dos alunos salvos !om su!esso0); } catch (*-,+!e&tion ioe){ t/%ensagem.set:e+t (0 Eo /oi &ossFvel salvar os dados dos alunos no arDuivo0); } } } class -uvinteLim&ar implements A!tionListener{ public void a!tion9er/ormed(A!tion,vent aev){ !ontrolador.lim&arDados(); } } public static void main(StringKL args) { new 6uiSim&lesSalvando(); } }

Você também pode gostar