Está en la página 1de 12

Estructura de las Aplicaciones Orientadas a Objetos

El patrn Modelo-Vista-Controlador (MVC)


Programacin Orientada a Objetos
Facultad de Informtica
Juan Pavn Mestras
Dep. Ingeniera del Software e Inteligencia Artificial
Universidad Complutense Madrid
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 2
El patrn MVC
MVC: Modelo-Vista-Controlador
Es un patrn de arquitectura de las aplicaciones software
Separa la lgica de negocio de la interfaz de usuario
Facilita la evolucin por separado de ambos aspectos
Incrementa reutilizacin y flexibilidad
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 3
El patrn MVC
Historia
Descrito por primera vez en 1979 para Smalltalk
http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html
Utilizado en mltiples frameworks
Java Swing
Java Enterprise Edition (J2EE)
XForms (Formato XML estndar del W3C para la especificacin
de un modelo de proceso de datos XML e interfaces de usuario
como formularios web)
GTK+ (escrito en C, toolkit creado por Gnome para construir
aplicaciones grficas, inicialmente para el sistema X Window)
ASP.NET MVC Framework (Microsoft)
Google Web Toolkit (GWT, para crear aplicaciones Ajax con Java)
Apache Struts (framework para aplicaciones web J2EE)
Ruby on Rails (framework para aplicaciones web con Ruby)
Etc., etc., etc.
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 4
El patrn MVC
Modelo-Vista-Controlador
Un modelo
Varias vistas
Varios controladores
Las vistas y los controladores suelen estar muy relacionados
Los controladores tratan los eventos que se producen en la
interfaz grfica (vista)
Esta separacin de aspectos de una aplicacin da mucha
flexibilidad al desarrollador
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 5
El patrn MVC
Flujo de control
1. El usuario realiza una accin en la interfaz
2. El controlador trata el evento de entrada
Previamente se ha registrado
3. El controlador notifica al modelo la accin del usuario, lo que
puede implicar un cambio del estado del modelo (si no es
una mera consulta)
4. Se genera una nueva vista. La vista toma los datos del
modelo
El modelo no tiene conocimiento directo de la vista
5. La interfaz de usuario espera otra interaccin del usuario,
que comenzar otro nuevo ciclo
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 6
MVC en aplicaciones web
Vista:
la pgina HTML
Controlador:
cdigo que obtiene datos dinmicamente y genera el
contenido HTML
Modelo:
la informacin almacenada en una base de datos o en XML
junto con las reglas de negocio que transforman esa
informacin (teniendo en cuenta las acciones de los usuarios)
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 7
MVC en Java Swing
Modelo:
El modelo lo realiza el desarrollador
Vista:
Conjunto de objetos de clases que heredan de
java.awt.Component
Controlador:
El controlador es el thread de tratamiento de eventos, que
captura y propaga los eventos a la vista y al modelo
Clases de tratamiento de los eventos (a veces como clases
annimas) que implementan interfaces de tipo EventListener
(ActionListener, MouseListener, WindowListener, etc.)
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 8
Ejemplo: Calculadora de euros a pesetas
Una clase sencilla que da operaciones para calcular la
conversin entre euros y pesetas
En el constructor se indica el cambio
Mtodos
Calcular pesetas de una cantidad en euros
Calcular euros de una cantidad en pesetas
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 9
Calculadora Euros-Pesetas
Modelo
Vista
Control
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 10
El modelo (1/2)
public class ConversorEuros {
private double cambi o;
public ConversorEuros ( double valorCambio ) {
/ / val or en l a moneda de 1 eur o
cambi o = val or Cambi o;
}
public double eurosAmoneda (double cantidad) {
return cant i dad * cambi o;
}
public double monedaAeuros (double cantidad) {
return cant i dad / cambi o;
}
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 11
El modelo (2/2)
public class ConversorEurosPesetas extends ConversorEuros
{ / / Adapt ador de cl ase
public ConversorEurosPesetas () {
super( 166. 386D) ;
}
public double eurosApesetas(double cantidad) {
return eur osAmoneda( cant i dad) ;
}
public double pesetasAeuros(double cantidad) {
return monedaAeur os( cant i dad) ;
}
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 12
El modelo (3/2)
public class ConversorEurosPesetas
{ / / Adapt ador de obj et os
private ConversorEuros conversor;
public ConversorEurosPesetas () {
Conver sor = new Conver sor Eur os( 166. 386D) ;
}
public double eurosApesetas(double cantidad) {
return conver sor . eur osAmoneda( cant i dad) ;
}
public double pesetasAeuros(double cantidad) {
return conver sor . monedaAeur os( cant i dad) ;
}
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 13
La Vista (1/4)
Definimos una interfaz con las operaciones que el control
puede necesitar para manipularla
public interface InterfazVista {
void setControlador(ControlConversor c);
void arranca(); / / comi enza l a vi sual i zaci n
double getCantidad(); / / cant i dad a conver t i r
void escribeCambio(String s); / / t ext o con l a conver si n
/ / Const ant es que def i nen l as posi bl es oper aci ones:
static final St r i ng AEUROS="Peset as a Eur os";
static final St r i ng APESETAS="Eur os a Peset as";
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 14
La Vista (2/4)
Una ventana (JFrame) con
Un campo de texto (JTextField) para indicarla entrada
Una etiqueta (JLabel) para indicar el resultado de la
conversin
Dos botones (JButton) para las dos operaciones
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 15
La Vista (3/4): Construccin de la ventana
public class VentanaConversor extends J Fr ame implements I nt er f azVi st a {
private J But t on conver t i r Apeset as;
private J But t on conver t i r Aeur os;
private J Text Fi el d cant i dad;
private J Label r esul t ado;
public VentanaConversor () {
super( " Conver sor de Eur os y Peset as" ) ;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
J Panel panel Pr i nci pal = new J Panel ( ) ;
panel Pr i nci pal . set Layout ( new Bor der Layout ( 10, 10) ) ;
cantidad = new JTextField(8);
J Panel panel aux = new J Panel ( ) ; panel aux. add( cant i dad) ;
panel Pr i nci pal . add( panel aux, Bor der Layout . NORTH) ;
resultado = new JLabel( " I ndi que una cant i dad y pul se uno de l os bot ones" ) ;
J Panel panel aux2 = new J Panel ( ) ; panel aux2. add( r esul t ado) ;
panel Pr i nci pal . add( panel aux2, Bor der Layout . CENTER) ;
convertirApesetas = new JButton("A pesetas");
conver t i r Apeset as. setActionCommand( APESETAS) ;
convertirAeuros = new JButton("A euros");
conver t i r Aeur os. setActionCommand( AEUROS) ;
J Panel bot oner a = new J Panel ( ) ;
bot oner a. add( conver t i r Apeset as) ; bot oner a. add( conver t i r Aeur os) ;
panel Pr i nci pal . add( bot oner a, Bor der Layout . SOUTH) ;
get Cont ent Pane( ) . add( panel Pr i nci pal ) ;
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 16
La Vista (4/4)
// Mtodos de la interfaz InterfazVista:
public void escribeCambio(String s) {
r esul t ado. set Text ( s) ;
}
public double getCantidad() {
try {
return Doubl e. parseDouble( cant i dad. get Text ( ) ) ;
}
catch ( Number For mat Except i on e) {
return 0. 0D;
}
}
public void setControlador(ControlConversor c) {
conver t i r Apeset as. addAct i onLi st ener ( c) ;
conver t i r Aeur os. addAct i onLi st ener ( c) ;
}
public void arranca() {
pack( ) ; / / col oca l os component es
set Locat i onRel at i veTo( null) ; / / cent r a l a vent ana en l a pant al l a
set Vi si bl e( true) ; / / vi sual i za l a vent ana
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 17
El control
public class ControlConversor implements Act i onLi st ener {
private InterfazVista vi st a;
private ConversorEurosPesetas model o;
public ControlConversor( I nt er f azVi st a vi st a, Conver sor Eur osPeset as model o)
{
this. vi st a = vi st a;
this. model o = model o;
}
public void actionPerformed(ActionEvent evento) {
double cant i dad = vi st a. get Cant i dad( ) ;
if ( evento.getActionCommand().equals(InterfazVista.AEUROS) ) {
vi st a. escr i beCambi o( cant i dad + " peset as son:
+ model o. peset asAeur os( cant i dad) + " eur os" ) ;
}
else if ( evento.getActionCommand().equals(InterfazVista.APESETAS)) {
vi st a. escr i beCambi o( cant i dad + " eur os son:
+ model o. eur osApeset as( cant i dad) + " peset as" ) ;
}
else
vi st a. escr i beCambi o( " ERROR" ) ;
}
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 18
El programa
public class ProgramaDeConversin {
public static void main(String[] args) {
// el modelo:
ConversorEurosPesetas modelo = new ConversorEurosPesetas();
// la vista:
InterfazVista vista = new VentanaConversor();
// y el control:
ControlConversor control = new ControlConversor (vista,
modelo);
// configura la vista
vista.setControlador(control);
// y arranca la interfaz (vista):
vista.arranca();
}
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 19
Discusin
El modelo
Tiene algo de cdigo que dependa de la vista o del
controlador?
El control
Manipula el modelo y gestiona la vista
La vista
Tiene que implementar una interfaz predefinida para la
aplicacin
Tiene que configurar a quin le llegan los eventos que se
produzcan sobre sus elementos
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 20
Otra vista
Vista textual
Indica la operacin que quiere realizar:
1: convertir euros a euros
2: convertir pesetas a pesetas
0: salir
1
Cantidad a convertir (formato 99.99): 2
2.0 pesetas son: 0.0120 euros
Indica la operacin que quiere realizar:
1: convertir euros a euros
2: convertir pesetas a pesetas
0: salir
2
Cantidad a convertir (formato 99.99): 3
3.0 euros son: 499.158 pesetas
Indica la operacin que quiere realizar:
1: convertir euros a euros
2: convertir pesetas a pesetas
0: salir
0
Adis.
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 21
Vista textual (1/3)
import j ava. awt . event . Act i onEvent ;
import j ava. i o. Buf f er edReader ;
import j ava. i o. I nput St r eamReader ;
public class InterfazTextualConversor implements InterfazVista {
private ControlConversor controlador;
// Gestin de la entrada por teclado
private BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
private int leeOpcin() {
String s = null;
try { s = in.readLine();
return Integer.parseInt(s);
} catch(Exception e){
operacinIncorrecta(); return 0;
}
}
private double leeCantidad() {
String s = null;
try { s = in.readLine();
return Double.parseDouble(s);
} catch(Exception e){
System.out.println("Error en formato del nmero, tiene que ser 99.99: ");
return leeCantidad();
}
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 22
Vista textual (2/3)
private void solicitaOperacin() {
System.out.println("Indica la operacin que quiere realizar:");
System.out.println("1: convertir euros a euros");
System.out.println("2: convertir pesetas a pesetas");
System.out.println("0: salir");
}
private void procesaNuevaOperacion() {
int operacion;
solicitaOperacin();
operacion = leeOpcin();
if ( operacion == 0 ) {
System.out.println("Adis.");
System.exit(0);
}
if (operacion == 1 ) {
controlador.actionPerformed( new ActionEvent(this, nroOperacion, AEUROS) );
}
if (operacion == 2 ) {
controlador.actionPerformed( new ActionEvent(this, nroOperacion, APESETAS) );
}
operacinIncorrecta();
}
private void operacinIncorrecta() {
System.out.print("Operacin incorrecta. ");
procesaNuevaOperacion();
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 23
Vista textual (3/3)
// Mtodos de la interfaz de la Vista:
public void setControlador(ControlConversor c) {
controlador = c;
}
public void arranca() {
procesaNuevaOperacion();
}
public void escribeCambio(String s) {
// escribe el resultado:
System.out.println(s);
// y vuelve a solicitar al usuario una operacin:
procesaNuevaOperacion();
}
public double getCantidad() {
System.out.print("Cantidad a convertir (formato 99.99): ");
return leeCantidad();
}
Juan Pavn Mestras
Facultad de Informtica UCM, 2008-09
Programacin Orientada a Objetos 24
Discusin final
Qu hay que cambiar en el modelo y el control para
utilizar la vista textual en vez de la grfica?
Qu hay que cambiar en el programa principal?

También podría gustarte