Documente Academic
Documente Profesional
Documente Cultură
de la Educacin"
UNIVERSIDAD NACIONAL DE PIURA
FACULTAD DE INGENIERIA
INDUSTRIAL
ESCUELA DE INGENIERIA INFORMATICA
PATRONES DE DISEO
DOCENTE:
ING. MOISES SAAVEDRA ARANGO
ALUMNOS:
CALLE GARCIA, Jairo Daro
MARCELO MAZA, Marcos Pal
VEGA CAMPOS, Jorge Junior
PIURA - 2015
ndice
Introduccin
3
Patrones
de
Diseo4
Patrones
Creacionales.5
Patrn
Factory
Method..5
Ejemplos
5
Patrn
Prototype..20
Ejemplos
..20
Patrn
Singleton.
28
Ejemplos
..29
Patrn
Model
View
Controller
(MVC)
.37
Ejemplos
..37
Patrones
Estructurales..74
Patrn
Composite.7
4
Ejemplos
..75
Patrn
Decorador..8
1
Ejemplos
..81
Patron
Facade..
88
Ejemplos
..88
Patrones
de
Comportamiento
.93
Patrn
Observer.9
3
Ejemplos
..94
Patrn
Strategy.1
04
Ejemplos
104
Introduccin
Patrones de diseo1
Un patrn de diseo constituye una solucin a un problema de diseo recurrente en
programacin orientada a objetos. Se define por 4 elementos esenciales:
Los patrones estn concebidos como diseos orientados a objetos, donde se identifican
clases e instancias, sus roles y colaboraciones, describen la distribucin de
responsabilidades. Usar un lenguaje orientado a objetos nos permitir aplicar e
implementar los patrones, ya que estos lenguajes nos darn el soporte necesario, aunque
hay que hacer constar que la implementacin podr variar notablemente segn el
lenguaje que usemos.
Objetivos:
Asimismo, no pretenden:
Patrones creacionales
El objetivo es la abstraccin de los mecanismos2 de creacin de objetos. Los
mecanismos de instanciacin de clases concretas se encapsulan en los patrones. En el
caso de que se modifique el conjunto de clases concretas a instanciar, las
modificaciones necesarias en el sistema sern mnimas o inexistentes.
Los patrones de construccin tienen la vocacin de abstraer los mecanismos de creacin
de objetos. Un sistema que utilice estos patrones se vuelve independiente de la forma en
que se crean los objetos, en particular, de los mecanismos de instanciacin de las clases
concretas.
Estos patrones encapsulan el uso de clases concretas y favorecen as el uso de las
interfaces en las relaciones entre objetos, aumentando las capacidades de abstraccin en
el diseo global del sistema.
Factory Method:
Centraliza en una clase constructora la creacin de objetos de un subtipo de un
tipo determinado, ocultando al usuario la casustica, es decir, la diversidad de
casos particulares que se pueden prever, para elegir el subtipo que crear. Parte
del principio de que las subclases determinan la clase a implementar.
Metodo factoria parametrizado
A continuacin se muestra el diagrama de clases del ejemplo realizado en clase:
<<interface>>
Archivo
CreadorArchivo
+crearArchivo(descriptor: String): Archivo
+crear()
ArchivoTxt
+crear()
ArchivoXml
+crear()
Cliente
+pedidos: List<Pedido>
+crearPedido(importe: double): Pedido
+nuevoPedido(importe: double)
ClienteContado
ClienteCredito
Pedido
+importe: double
+paga()
+valida(): boolean
PedidoContado
PedidoCredito
+paga()
+valida(): boolean
+paga()
+valida(): boolean
Cdigo fuente
Cliente.java
import java.util.*;
public abstract class Cliente
{
protected List<Pedido> pedidos = new ArrayList<Pedido>();
protected abstract Pedido creaPedido(double importe);
public void nuevoPedido(double importe)
{
Pedido pedido =this.creaPedido(importe);
if(pedido.valida())
{
pedido.paga();
pedidos.add(pedido);
}
}
}
ClienteContado.java
public class ClienteContado extends Cliente
{
@Override
protected Pedido creaPedido(double importe)
{
return new PedidoContado(importe);
}
}
ClienteCredito.java
public class ClienteCredito extends Cliente
{
@Override
protected Pedido creaPedido(double importe)
{
return new PedidoCredito(importe);
}
}
Pedido.java
public abstract class Pedido {
protected double importe;
public Pedido(double importe) {
this.importe = importe;
}
public abstract boolean valida();
public abstract void paga();
}
PedidoContado.java
public class PedidoContado extends Pedido {
public PedidoContado(double importe)
{
super(importe);
}
@Override
public void paga()
{
System.out.println(" El pago del pedido por importe de : "+
importe +" se ha realizado.");
}
@Override
public boolean valida()
{
return true;
}
}
PedidoCredito.java
public class PedidoCredito extends Pedido{
public PedidoCredito(double importe)
{
super(importe);
}
@Override
public void paga()
{
System.out.println("El pago del pedido a credito de : "+
importe +"se ha realizado.");
}
@Override
public boolean valida()
{
return (importe >=1000.0)&&(importe <=5000.0);
}
}
Usuario.java
public class Usuario
{
public static void main(String[] args)
{
Cliente cliente;
cliente= new ClienteContado();
cliente.nuevoPedido(2000.0);
cliente.nuevoPedido(10000.0);
cliente=new ClienteCredito();
cliente.nuevoPedido(2000.0);
cliente.nuevoPedido(10000.0);
}
}
Al ejecutar el cdigo obtenemos
Calculadora
<<interface>>
Operaciones
+Calcular(): double
Division
Multiplicacion
Suma
Resta
+t: Scanner
+t: Scanner
+t: Scanner
+t: Scanner
+Calcular(): double
+Calcular(): double
+Calcular(): double
+Calcular(): double
Ejemplo2
Calculadora.java
public class Calculadora {
public static Operaciones Operar(double opcion) {
Operaciones operaciones;
if (opcion == 1) {
operaciones = new Suma();
return operaciones;
}
if (opcion == 2) {
operaciones = new Resta();
return operaciones;
}
if (opcion == 3) {
operaciones = new Multiplicacion();
return operaciones;
}
if (opcion == 4) {
operaciones = new Division();
return operaciones;
}
if (opcion == 5) {
System.exit(0);
}
// elifse
return null;
return null;
}
}
Operaciones.java
public interface Operaciones {
public double Calcular();
}
Division.java
import java.util.Scanner;
public class Division implements Operaciones{
Scanner t=new Scanner(System.in);
@Override
public double Calcular() {
double div;
System.out.println("ingrese el primer numero");
double a= t.nextDouble();
System.out.println("ingrese el segundo numero");
double b=t.nextDouble();
if(b==0){
System.out.println("no existe division entre 0");
}
return div=a/b;
}
}
Multiplicacion.java
import java.util.Scanner;
public class Multiplicacion implements Operaciones {
Scanner t=new Scanner(System.in);
@Override
public double Calcular() {
double mult1;
double opcion;
do {
System.out.println("Que OPERACION DESEA CALCULAR");
System.out.println("1-SUMA");
System.out.println("2-RESTA");
System.out.println("3-MULTIPLICACION");
System.out.println("4-DIVISION");
System.out.println("5-SALIR");
opcion=t.nextDouble();
Operaciones operaciones = Calculadora.Operar(opcion);
System.out.println(operaciones.Calcular());
} while (opcion !=5);
}
}
Al ejecutar el cdigo tenemos
<<abstract>>
CreadorArchivo
+crearArchivo(): Archivo
CreadorArchivoTxt
CreadorArchivoXml
+crearArchivo(): Archivo
+crearArchivo(): Archivo
<<interface>>
Archivo
+crear()
ArchivoTxt
+crear()
ArchivoXml
+crear()
}
CreadorArchivoXml.java
public class CreadorArchivoXml extends CreadorArchivo{
public Archivo crearArchivo(){
return new ArchivoXml();
}
}
Principal.java
public class Principal {
public static void main(String[] args) {
CreadorArchivo fabrica = new CreadorArchivoTxt();
ArchivoTxt archivoTxt= (ArchivoTxt)fabrica.crearArchivo();
archivoTxt.crear();
fabrica = new CreadorArchivoXml();
ArchivoXml archivoXml= (ArchivoXml)fabrica.crearArchivo();
archivoXml.crear();
}
}
A continuacin ejemplos de este patrn
Ejemplo1
principal
+main(args: String [])
<<interface>>
CreadorFactory
+crearProducto(): Producto
CamisetaFactory
ProductoFactory
+crearProducto(): Producto
+crearProducto(pf: CreadorFactory)
ZapatillaFactory
+creaProducto(): Producto
Camiseta
Zapatilla
+getDscripcion(): String
+getPrecio(): int
+getDescripcion(): String
+getPrecio(): int
<<interface>>
Producto
+getDescripcion(): String
+getPrecio(): int
CreadorFactory.java
public interface CreadorFactory {
Producto crearProducto();
}
CamisetaFactory.java
public class CamisetaFactory implements CreadorFactory {
@Override
public Producto crearProducto() {
Camiseta pf = new Camiseta();
return pf;
}
}
ProductoFactory.java
public class ProductoFactory {
public static void crearProducto(CreadorFactory pf) {
Producto producto = pf.crearProducto();
System.out.print("Creando: " + producto.getDescripcion() + " " +
"el precio del producto es" + "\n" + producto.getPrecio() + "soles" +
"\n");
}
}
ZapatillaFactory.java
public class ZapatillaFactory implements CreadorFactory {
@Override
public Producto crearProducto() {
Zapatilla pf = new Zapatilla();
return pf;
}
}
Camiseta.java
public class Camiseta implements Producto {
@Override
public int getPrecio() {
return 15;
}
@Override
public String getDescripcion() {
return getClass().getName();
}
}
Zapatilla.java
public class Zapatilla implements Producto {
@Override
public int getPrecio() {
return 120;
}
@Override
public String getDescripcion() {
return "el producto" + "\n" + getClass().getCanonicalName().intern();
}
}
Producto.java
public interface Producto {
int getPrecio();
String getDescripcion();
}
Principal.java
public class Principal {
public static void main(String[] args) {
ZapatillaFactory pf = new ZapatillaFactory();
ProductoFactory.crearProducto(pf);
}
}
Al ejecutar el programa obtenemos
Ejemplo2
Principal
-S: Scanner = new Scanner(System.in)
+usarServicio(factory: ServicioFactory)
+preguntarServicio(): int
+main(args: String[])
<<interface>>
ServicioFactory
+crearServicio(): ServicioCarpinteria
+CreateProduct()
EscritFactory
+crearServicio(): ServicioCarpinteria
Servicio_ Escritoriopc
+asignarTrabajo()
+indicarFechaEntrega()
+informarSobrePago()
MueblesFactory
SerPuFactory
+crearServicio(): ServicioCarpinteria
+crearServicio(): ServicioCarpinteria
Servicio_ Muebleria
+asignarTrabajo()
+indicarFechaEntrega()
+informarSobrePago()
<<interface>>
ServicioCarpinteria
+asignarTrabajo()
+indicarFechaEntrega()
+informarSobrePago()
Cdigo Fuente
ServicioFactory.java
public interface ServicioFactory {
public ServicioCarpinteria crearServicio();
}
EscritFactory.java
public class EscritFactory implements ServicioFactory {
@Override
public ServicioCarpinteria crearServicio() {
return new Servicio_Escritoriospc();
}
}
MueblesFactory.java
public class MueblesFactory implements ServicioFactory {
@Override
public ServicioCarpinteria crearServicio() {
return new Servicio_Muebleria();
}
}
SerPuFactory.java
public class SerPuFactory implements ServicioFactory{
@Override
public ServicioCarpinteria crearServicio() {
return new Servicio_puertas();
}
Servicio_ Puerta
+asignarTrabajo()
+indicarFechaEntrega()
+informarSobrePago()
}
Servicio_Escritoriospc.java
public class Servicio_Escritoriospc implements ServicioCarpinteria{
@Override
public void asignarTrabajo() {
System.out.println("El personal encargado confeccion de Escritorios para
ha aceptado el trabajo.");
}
@Override
public void indicarFechaEntrega() {
System.out.println("La Fecha de entrega es 26/04/2015.");
}
@Override
public void informarSobrePago() {
System.out.println("El monto a pagar incluye el pago por pintado y
detalles.");
}
}
Servicio_Muebleria.java
public class Servicio_Muebleria implements ServicioCarpinteria {
@Override
public void asignarTrabajo() {
System.out.println("Nuestros Expertos en muebles han sido informados del
trabajo A realizar.");
}
@Override
public void indicarFechaEntrega() {
System.out.println("Se ha fijado como fecha de entrega el da
25/03/2015.");
}
@Override
public void informarSobrePago() {
System.out.println("El monto a pagar ser 1500 por los cuatro muebles
confeccionados y se hara en efectivo el dia de la entrega.");
}
}
Servicio_puertas.java
public class Servicio_puertas implements ServicioCarpinteria{
@Override
public void asignarTrabajo() {
System.out.println("El trabajado ha sido asignado a Nuestros Carpinteros
disponibles.");
}
@Override
public void indicarFechaEntrega() {
servicio.informarSobrePago();
}
public static int preguntarServicio() {
System.out.print(
"BIENBENIDOS A CARPINTERIA JAYO.SAC\n"+
"******************\n"
+
"MEN DE OPCIONES\n"
+ "* * * * * * * * * * * * * * * * * * *\n"
+ "*1. Solicitar servicio de diseo e instalacion de Puertas.
*\n"
+ "*2. Solicitar confeccion de muebles.
*\n"
+ "*3. Solicitar Servicio Para Diseo y confeccion de Escritorios para
PC. *\n"
+ "*4. Cerrar programa.
*\n"
+ "* * * * * * * * * * * * * * * * * * *\n"
+ "->"
+ "*Seleccione opcin: "
);
return Integer.parseInt( S.nextLine() );
}
}
Al ejecutar el programa obtenemos
Prototype :
El objetivo de este patrn es la creacin de nuevos objetos mediante duplicacin
de objetos existentes llamados prototipos que disponen de la capacidad de
clonacin.
Este patrn especifica la clase de objetos a crear mediante la clonacin de un
prototipo que es una instancia ya creada. La clase de los objetos que servirn de
prototipo deber incluir en su interfaz la manera de solicitar una copia, que ser
desarrollada luego por las clases concretas de prototipos.
En clase observamos el siguiente ejemplo mostrado en el diargama:
producto
-descripcion: String
-precio: double
-stock: double
Lo que hace es
valor
entre
Cdigo fuente
Producto.java
import
+Producto()
+Producto(descripcion: String, precio: double, stock: double)
+getDescripcion(): String
+getPrecio(): double
+getStock(): double
+setDescripcion(descripcion: String)
+setPrecio(precio: double)
+setStock(stock: double)
+Clone()
this.precio = precio;
}
public void setStock(double stock) {
this.stock = stock;
}
}
Principal.java
public class Principal {
public static void main(String[] args) {
try {
Producto producto1 = new Producto("Cereal", 4, 20);
Producto producto2 = producto1;//asigna referencias
System.out.println(producto1);
System.out.println(producto2);
System.out.println(producto1.getDescripcion());
System.out.println(producto2.getDescripcion());
Producto producto3 = new Producto("Detergente", 3, 40);
Producto producto4 = producto3.clone();
System.out.println(producto3);
System.out.println(producto4);
System.out.println(producto3.getDescripcion());
System.out.println(producto4.getDescripcion());
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Aqu mostraremos los diagramas de clases de 2 ejemplos:
Ejemplo1
<<Abstract>>
Enemigo
GestorEnemigo
-henemigos: Hashtable
+GestorEnemigo()
+addEnemigo(nombre: String, objEnemigo: Enemigo)
+getClon(nombre: String): Enemigo
+getClon(nombre: String): Enemigo
Cdigo
GestorEnemigo.java
import java.util.Hashtable;
public class GestorEnemigo{
Guerrero
Hechicero
+Guerrero()
+atacar()
+detener()
+clonar(): Enemigo
+Hechicero()
+atacar()
+detener()
+clonar(): Enemigo
fuente
Main.java
public class Main
{
public static void main(String[] args)
{
GestorEnemigo objGP = new GestorEnemigo();
// Obtenemos el Guerrero original
Enemigo g1 = objGP.getEnemigo("Warrior1");
System.out.println("==============================");
// Mostramos su datos
System.out.println("El Guerrero original se llama [" + g1.getNombre() +
"]");
System.out.println("Su arma es [" + g1.getArma() + "]");
System.out.println("==============================");
// Obtener un segundo Guerrero (clon del anterior)
Enemigo g2 = objGP.getClon("Warrior1");
// Mostrar los datos (ambos tienen datos similares)
System.out.println("Clon del Guerrero creado:");
System.out.println("Su nombre es [" + g2.getNombre() + "]");
System.out.println("Su arma es [" + g2.getArma() + "]");
System.out.println("==============================");
// Modificamos el Guerrero clonado
g2.setNombre("Warrior2");
g2.setArma("HACHA");
// Mostrar los datos de ambos Guerreros (ambos tienen diferentes datos)
System.out.println("Tras modificar el clon, ahora se llama [" +
g2.getNombre() + "]");
System.out.println("Su arma es [" + g2.getArma() + "]\n");
System.out.println("El nombre del Guerrero original es [" +
g1.getNombre() + "]");
System.out.println("Su arma es [" + g1.getArma() + "]");
System.out.println("==============================");
// Modificamos el Guerrero original
g1.setNombre("Warrior-1");
g1.setArma("MAZA");
// Mostrar los datos de ambos Guerreros tras la modificacin (ambos
tienen diferentes datos)
Ejemplo2
Cdigo fuente
Documentacion.java
import java.util.*;
public abstract class Documentacion {
protected List<Documento> documentos;
public List<Documento> getDocumentos(){
return documentos;
}
}
DocumentacionCliente.java
import java.util.*;
public class DocumentacionCliente extends Documentacion {
resultado = (Documento)this.clone();
}
catch (CloneNotSupportedException exception){
return null;
}
return resultado;
}
public void rellena(String informacion) {
contenido = informacion;
}
public abstract void imprime();
public abstract void visualiza();
}
CertificadoCesion.java
public class CertificadoCesion extends Documento{
public void visualiza(){
System.out.println("Muestra el certificado de cesion: " + contenido);
}
public void imprime(){
System.out.println("Imprime el certificado de cesion: " + contenido);
}
}
OrdenDePedido.java
public class OrdenDePedido extends Documento {
public void visualiza(){
System.out.println("Muestra la orden de pedido: " + contenido);
}
public void imprime(){
System.out.println("Imprime la orden de pedido: " +contenido);
}
}
SolicitudMatriculacion.java
public class SolicitudMatriculacion extends Documento {
public void visualiza(){
System.out.println("Muestra la solicitud de matriculacion: " +
contenido);
}
public void imprime(){
System.out.println("Imprime la solicitud de matriculacion: " +
contenido);
}
}
Main.java
public class Usuario {
public static void main(String[] args){
//inicializacion de la documentacion en blanco
DocumentacionEnBlanco documentacionEnBlanco =
DocumentacionEnBlanco.Instance();
documentacionEnBlanco.incluye(new OrdenDePedido());
documentacionEnBlanco.incluye(new CertificadoCesion());
documentacionEnBlanco.incluye(new SolicitudMatriculacion());
// creacion de documentacion nueva para dos clientes
DocumentacionCliente documentacionCliente1 = new
DocumentacionCliente("Martin");
DocumentacionCliente documentacionCliente2 = new
DocumentacionCliente("Simon");
documentacionCliente1.visualiza();
documentacionCliente2.visualiza();
}
}
Al ejecutar el cdigo obtenemos
Singleton :
Tiene como objetivo asegurar que una clase slo posee una instancia y
proporcionar un mtodo de clase nico que devuelva esta instancia.
Garantiza la existencia de una nica instancia para una clase y la creacin de un
mecanismo de acceso global a dicha instancia. Restringe la instanciacin de una
clase o valor de un tipo a un solo objeto. Para asegurar que la clase no puede ser
instanciada nuevamente se regula el alcance del constructor (con atributos como
protegido o privado).
Las situaciones ms habituales de aplicacin de este patrn son aquellas en las
que dicha clase controla el acceso a un recurso fsico nico o cuando cierto tipo
de datos debe estar disponible para todos los dems objetos de la aplicacin.
En clase observamos el siguiente ejemplo mostrado en su diagrama de clase:
Singleton
+instance = null: Singleton
+numero: int
-Singleton()
+getInstancia(): Clase
+getNumero(): int
+setNumero(int numero)
+Instance(): Singleton
En
este
crear una nica
creando
un
clases.
Cdigo fuente del ejemplo visto en clase:
Clase.java
public class Clase {
private static Clase instancia=null;
-instance
Cdigo fuente
Instancia.java
import javax.swing.JFrame;
public class Instancia {
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jPanel1.setBackground(new java.awt.Color(255, 255, 255));
javax.swing.GroupLayout jPanel1Layout = new
javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEAD
ING)
.addGap(0, 557, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEAD
ING)
.addGap(0, 259, Short.MAX_VALUE)
);
jMenu1.setText("File");
jMenuItem1.setText("Login");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem1);
jMenuItem2.setText("Salir");
jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem2ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem2);
jMenuBar1.add(jMenu1);
setJMenuBar(jMenuBar1);
javax.swing.GroupLayout layout = new
javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
JFrame valor = Instancia.getInstacia();
valor.setVisible(true);
Instancia.vecesLlamado();
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Error al mostrar
formulario","Error",JOptionPane.ERROR_MESSAGE);
}
}
private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code
(optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default
look and feel.
* For details see
http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info :
javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(Frm_Principal.class.getName()).log(java.util
.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(Frm_Principal.class.getName()).log(java.util
.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(Frm_Principal.class.getName()).log(java.util
.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(Frm_Principal.class.getName()).log(java.util
.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new Frm_Principal().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Al ejecutar el programa tenemos
Ejemplo 2
Marcianos
-cantidad: int
-marcianos: Marcianos
-creaMarcianos()
-instance
+cuantosQuedan()
+derribaMarcianos()
+getMarcianos(): Marcianos
Computadora
-marcianos: Marcianos
+creaMarcianos()
J ugador
-marcianos: Marcianos
+destruirMarcianos()
Marcianos.java
public final class Marcianos{
private static final Marcianos marcianos = new Marcianos();
private static int cantidad;
private Marcianos(){
cantidad = 10;
}
public static Marcianos getMarcianos(){
return marcianos;
}
public static void derribaMarcianos(){
if(cantidad>0){
cantidad--;
System.out.println("Soy el bueno, derribe un marciano");
}
}
public static void creaMarcianos(){
if(cantidad>0){
cantidad++;
System.out.println("Soy el malo, cree un marciano");
}
}
public static void cuantosQuedan(){
if(cantidad>0){
System.out.println("Quedan en el juego: "+cantidad+"
marcianos");
} else {
System.out.println("Felicidades, has ganado!!!");
}
}
}
Computadora.java
public class Computadora{
private Marcianos marcianos;
public Computadora(){
marcianos = Marcianos.getMarcianos();
}
public void creaMarcianos(){
marcianos.creaMarcianos();
}
}
Jugador.java
public class Jugador{
private Marcianos marcianos;
public Jugador(){
marcianos = Marcianos.getMarcianos();
}
public void destruirMarciano(){
marcianos.derribaMarcianos();
}
}
Juego.java
import java.util.Scanner;
public class Juego{
public static void main(String... args){
Marcianos marcianos;
Computadora computadora;
Jugador jugador;
Scanner sc;
marcianos = Marcianos.getMarcianos();
computadora = new Computadora();
jugador = new Jugador();
sc = new Scanner(System.in);
int disparos;
do{
System.out.print("Digite los disparos: ");
disparos = sc.nextInt();
for(int i=0; i<disparos; i++){
jugador.destruirMarciano();
}
computadora.creaMarcianos();
marcianos.cuantosQuedan();
} while (disparos!=0);
}
}
Al ejecutar el programa tenemos
En lo cual a
travs de este men
podramos
agregar
un
nuevo
producto y listarlo, en este patrn est separado por modelo, vista y controlador.
A travs del controlador permite elegir que recursos de vista quiero mostrar.
Codigo fuente del ejemplo visto en clase:
Vistas:
formRegistrarProducto.jsp:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Nuevo producto</h1>
<table>
<form action="ControladorProducto">
<tr>
<td>Descripcin</td>
<td><input type="text" name="txtDescripcion"/></td>
</tr>
<tr>
<td>Precio</td>
<td><input type="text" name="txtPrecio"/></td>
</tr>
<tr>
<td>Stock</td>
<td><input type="text" name="txtStock"/></td>
</tr>
<tr>
<td><input type="submit" name="operacion"
value="Registrar"/></td>
<td><input type="submit" name="operacion"
value="Cancelar"/></td>
</tr>
</form>
</table>
</body>
</html>
Menu.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Operaciones de producto</h1>
<ul>
<li><a href="./ControladorProducto?
operacion=FormRegistrar">Nuevo producto</a></li>
<li><a href="./ControladorProducto?
operacion=FormEliminar">Eliminar producto</a></li>
<li><a href="./ControladorProducto?
operacion=FormModificar">Modificar producto</a></li>
<li><a href="./ControladorProducto?
operacion=FormBuscar">Buscar producto</a></li>
<li><a href="./ControladorProducto?operacion=Listar">Listar
productos</a></li>
</ul>
</body>
</html>
vistaListarProductos:
<%@page
contentType="text/html"
pageEncoding="UTF-8"
import="java.util.*,app.entidad.*"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Listado de productos</h1>
<table>
<%
ArrayList<Producto> productos = (ArrayList)
request.getAttribute("productos");
if (productos != null) {
for (Producto p : productos) {
out.println("<tr> <td>" + p.getDescripcion() + "</td>"
+ "<td>" + p.getPrecio() + "</td>"
+ "<td> " + p.getStock() + " </td> </tr>");
}
} else {
out.println("No hay datos de productos");
}
%>
</table>
</body>
</html>
vistaRegistrarProductros.jsp
<%@page
contentType="text/html"
pageEncoding="UTF-8"
import="java.util.*,app.entidad.*"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Listado de productos</h1>
<table>
<%
ArrayList<Producto> productos = (ArrayList)
request.getAttribute("productos");
if (productos != null) {
if (operacion.equals("Registrar")) {
try {
String descripcion=request.getParameter("txtDescripcion");
Double
precio=Double.parseDouble(request.getParameter("txtPrecio"));
Double
stock=Double.parseDouble(request.getParameter("txtStock"));
Producto producto = new Producto(descripcion, precio, stock);
request.setAttribute("producto", producto);
servicio.registrarProducto(producto);
} catch (Exception e) {
request.setAttribute("error", e.getMessage());
}
RequestDispatcher rd =
request.getRequestDispatcher("vistaRegistrarProducto.jsp");
rd.forward(request, response);
}
if (operacion.equals("Cancelar")) {
response.sendRedirect("menu.jsp");
}
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
app.dao:
ProductoDao.java
import app.entidad.Producto;
import base.datos.BaseDatos;
import java.sql.ResultSet;
import java.util.ArrayList;
app.servicio
ProductoServicio.java
import app.dao.ProductoDao;
import app.entidad.Producto;
import java.util.ArrayList;
public class ProductoServicio {
public void registrarProducto(Producto p) throws Exception{
if(p==null) throw new Exception("El producto est vaco");
ProductoDao dao= new ProductoDao(p);
dao.registrar();
}
public ArrayList listarProductos() throws Exception{
return new ProductoDao().listar();
}
}
Base.datos
BaseDatos.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class BaseDatos {
static Connection conexion;
public static void conectar() throws Exception{
try {
Class.forName("com.mysql.jdbc.Driver");
conexion = DriverManager.getConnection(
"jdbc:mysql://localhost/proyecto", "root", "");
} catch (Exception e) {
throw new Exception("Imposible realizar conexion con la
BD"+e.getMessage());
}
}
public static ResultSet consultar(String sql) throws Exception{
try{
Statement st = conexion.createStatement();
ResultSet resultado = st.executeQuery(sql);
return resultado;
}
catch (Exception e) {
throw new Exception("Error al consultar la
BD"+e.getMessage());
}
}
public static int ejecutar(String sql) throws Exception{
try{
Statement st = conexion.createStatement();
int resultado = st.executeUpdate(sql);
return resultado;
}
catch (Exception e) {
throw new Exception("Error al actualizar la
BD"+e.getMessage());
}
}
public static void desconectar() throws Exception{
try{
conexion.close();
}
catch(Exception e){
throw new Exception("Error al desconectar con la
BD"+e.getMessage());
}
}
}
Acontinuacion ejemplos de este patrn:
Ejemplo1
controlador
+modelo: modelo
+vista: vista
+actionPerformed(e: ActionEvent)
+iniciar_vista()
modelo
+total: int
+valor1: int
+valor2: int
+get_total(): int
+get_valor1(): int
+get_valor2(): int
+set_valor1(val: int)
+set_valor2(val: int)
vista
+cmdsumar: J MenuItem
-jLabel2: J Label
-jLabel3: J Label
-jMenu1: J Menu
-jMenu2: J Menu
-cmdsumarActionPerformed(evt: ActionEvent)
-initComponents()
-jMenuItem1ActionPerformed(evt: ActionEvent)
+main(args: String [])
Controlador.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import Modelo.modelo;
import Vista.vista;
public class controlador implements ActionListener{
private vista vista;
private modelo modelo;
//En el constructor inicializamos nuestros objetos y tambien
//aadimos el ActionListener al boton "cmdsumar" de la VISTA
public controlador( vista vista , modelo modelo){
this.vista = vista;
this.modelo = modelo;
this.vista.cmdsumar.addActionListener(this);
}
Cdigo
fuente
//Inicia los valores del jFrame VISTA con los datos del MODELO
public void iniciar_vista(){
vista.setTitle( "Demo MVC * jc-mouse.net" );
vista.setLocationRelativeTo(null);
vista.vtxt1.setText( String.valueOf(modelo.get_valor1()) );
vista.vtxt2.setText( String.valueOf(modelo.get_valor2()) );
vista.vtxt3.setText( String.valueOf(modelo.get_total()) );
}
//La accion del boton de la VISTA es capturado, asi como los valores de
//los jtextbox, entonces se realiza la funcion SUMAR y se actualiza
//el jtextbox correspondiente al resultado
public void actionPerformed(ActionEvent e) {
modelo.set_valor1( Integer.valueOf( vista.vtxt1.getText() ) );
modelo.set_valor2( Integer.valueOf( vista.vtxt2.getText() ) );
modelo.sumar();
vista.vtxt3.setText( String.valueOf(modelo.get_total()) );
}
}
Modelo.java
public class modelo {
//Variables
private int valor1=0;
private int valor2=0;
private int total = sumar();
public modelo(){}
public void set_valor1(int val){
this.valor1=val;
}
public int get_valor1(){
return this.valor1;
}
public void set_valor2(int val){
this.valor2=val;
}
public int get_valor2(){
return this.valor2;
}
public int sumar(){
this.total = this.valor1 + this.valor2;
return this.total;
}
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(20, 0, 20, 0);
getContentPane().add(jLabel2, gridBagConstraints);
vtxt1.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
vtxt1.setText("0");
vtxt1.setPreferredSize(new java.awt.Dimension(60, 40));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(20, 10, 20, 0);
getContentPane().add(vtxt1, gridBagConstraints);
jLabel3.setFont(new java.awt.Font("Tahoma", 1, 36)); // NOI18N
jLabel3.setText("+");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(20, 0, 20, 0);
getContentPane().add(jLabel3, gridBagConstraints);
vtxt2.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
vtxt2.setText("0");
vtxt2.setPreferredSize(new java.awt.Dimension(60, 40));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(20, 0, 20, 0);
getContentPane().add(vtxt2, gridBagConstraints);
jMenu1.setText("File");
jMenuItem1.setText("Salir");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem1);
jMenuBar1.add(jMenu1);
jMenu2.setText("Herramientas");
cmdsumar.setText("Sumar");
cmdsumar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cmdsumarActionPerformed(evt);
}
});
jMenu2.add(cmdsumar);
jMenuBar1.add(jMenu2);
setJMenuBar(jMenuBar1);
pack();
}// </editor-fold>
private void cmdsumarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
System.exit(0);
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new vista().setVisible(true);
}
});
}
// Variables declaration - do not modify
public javax.swing.JMenuItem cmdsumar;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenu jMenu2;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
public javax.swing.JTextField vtxt1;
public javax.swing.JTextField vtxt2;
public javax.swing.JTextField vtxt3;
// End of variables declaration
}
Main.java
import controlador.controlador;
import Modelo.modelo;
import Vista.vista;
public class Main {
public static void main(String[] args) {
Ejemplo2
Cdigo fuente
Logica.java
package modelo;
import
javax.swing.JOptionPane;
import modelo.dao.PersonaDao;
import modelo.vo.PersonaVo;
import controlador.Coordinador;
public class Logica {
private Coordinador miCoordinador;
public static boolean consultaPersona=false;
public static boolean modificaPersona=false;
public void setCoordinador(Coordinador miCoordinador) {
this.miCoordinador=miCoordinador;
}
public void validarRegistro(PersonaVo miPersona) {
PersonaDao miPersonaDao;
if (miPersona.getIdPersona() > 99) {
miPersonaDao = new PersonaDao();
miPersonaDao.registrarPersona(miPersona);
}else {
JOptionPane.showMessageDialog(null,"El documento de la
persona debe ser mas de 3
digitos","Advertencia",JOptionPane.WARNING_MESSAGE);
}
}
public PersonaVo validarConsulta(String codigoPersona) {
PersonaDao miPersonaDao;
try {
int codigo=Integer.parseInt(codigoPersona);
if (codigo > 99) {
miPersonaDao = new PersonaDao();
consultaPersona=true;
return miPersonaDao.buscarPersona(codigo);
}else{
JOptionPane.showMessageDialog(null,"El
documento de la persona debe ser mas de 3
digitos","Advertencia",JOptionPane.WARNING_MESSAGE);
consultaPersona=false;
}
}catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null,"Debe ingresar un
dato numerico","Error",JOptionPane.ERROR_MESSAGE);
consultaPersona=false;
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Se ha presentado
un Error","Error",JOptionPane.ERROR_MESSAGE);
consultaPersona=false;
}
return null;
}
public void validarModificacion(PersonaVo miPersona) {
PersonaDao miPersonaDao;
if (miPersona.getNombrePersona().length()>5) {
miPersonaDao = new PersonaDao();
miPersonaDao.modificarPersona(miPersona);
modificaPersona=true;
}else{
JOptionPane.showMessageDialog(null,"El nombre de la
persona debe ser mayor a 5
digitos","Advertencia",JOptionPane.WARNING_MESSA
GE);
modificaPersona=false;
}
}
public void validarEliminacion(String codigo) {
PersonaDao miPersonaDao=new PersonaDao();
miPersonaDao.eliminarPersona(codigo);
}
}
Conexin.java
package modelo.conexion;
import java.sql.*;
public class Conexion {
static String bd = "codejavu";
static String login = "root";
static String password = "";
static String url = "jdbc:mysql://localhost/"+bd;
Connection conn = null;
/** Constructor de DbConnection */
public Conexion() {
try{
//obtenemos el driver de para mysql
Class.forName("com.mysql.jdbc.Driver");
//obtenemos la conexin
conn = DriverManager.getConnection(url,login,password);
if (conn!=null){
System.out.println("Conexin a base de datos "+bd+" OK");
}
}
catch(SQLException e){
System.out.println(e);
}catch(ClassNotFoundException e){
System.out.println(e);
}catch(Exception e){
System.out.println(e);
}
}
/**Permite retornar la conexin*/
public Connection getConnection(){
return conn;
}
public void desconectar(){
conn = null;
}
}
PersonaDao.java
package modelo.dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import controlador.Coordinador;
import modelo.conexion.Conexion;
import modelo.vo.PersonaVo;
/**
* Clase que permite el acceso a la base de datos
* @author chenao
*
*/
public class PersonaDao
{
public void registrarPersona(PersonaVo miPersona)
{
Conexion conex= new Conexion();
try {
Statement estatuto =
conex.getConnection().createStatement();
estatuto.executeUpdate("INSERT INTO persona VALUES
('"+miPersona.getIdPersona()+"', '"
+miPersona.getNombrePersona()+"',
'"+miPersona.getEdadPersona()+"', '"
+miPersona.getProfesionPersona()+"',
'"+miPersona.getTelefonoPersona()+"')");
JOptionPane.showMessageDialog(null, "Se ha registrado
Exitosamente","Informacin",JOptionPane.INFORMATION_MESSAGE);
estatuto.close();
conex.desconectar();
} catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "No se Registro");
}
}
public PersonaVo buscarPersona(int codigo)
{
Conexion conex= new Conexion();
PersonaVo persona= new PersonaVo();
boolean existe=false;
try {
//Statement estatuto =
conex.getConnection().createStatement();
PreparedStatement consulta =
conex.getConnection().prepareStatement("SELECT * FROM persona where id
= ? ");
consulta.setInt(1, codigo);
ResultSet res = consulta.executeQuery();
while(res.next()){
existe=true;
persona.setIdPersona(Integer.parseInt(res.getString("id")));
persona.setNombrePersona(res.getString("nombre"));
persona.setEdadPersona(Integer.parseInt(res.getString("edad")));
persona.setProfesionPersona(res.getString("profesion"));
persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));
}
res.close();
conex.desconectar();
} catch (SQLException e) {
JOptionPane.showMessageDialog(null,
"Error, no se conecto");
System.out.println(e);
}
if (existe) {
return persona;
}
else return null;
}
public void modificarPersona(PersonaVo miPersona) {
Conexion conex= new Conexion();
try{
String consulta="UPDATE persona SET id= ? ,nombre = ?
, edad=? , profesion=? , telefono= ? WHERE id= ? ";
PreparedStatement estatuto =
conex.getConnection().prepareStatement(consulta);
estatuto.setInt(1, miPersona.getIdPersona());
estatuto.setString(2, miPersona.getNombrePersona());
estatuto.setInt(3, miPersona.getEdadPersona());
estatuto.setString(4, miPersona.getProfesionPersona());
estatuto.setInt(5,miPersona.getTelefonoPersona());
estatuto.setInt(6, miPersona.getIdPersona());
estatuto.executeUpdate();
JOptionPane.showMessageDialog(null, " Se ha Modificado Correctamente
","Confirmacin",JOptionPane.INFORMATION_MESSAGE);
}catch(SQLException
e){
System.out.println(e);
JOptionPane.showMessageDialog(null, "Error al
Modificar","Error",JOptionPane.ERROR_MESSAGE);
}
}
public void eliminarPersona(String codigo)
{
Conexion conex= new Conexion();
try {
Statement estatuto =
conex.getConnection().createStatement();
estatuto.executeUpdate("DELETE FROM persona
WHERE id='"+codigo+"'");
JOptionPane.showMessageDialog(null, " Se ha Eliminado
Correctamente","Informacin",JOptionPane.INFORMATION_MESSAGE);
estatuto.close();
conex.desconectar();
} catch (SQLException e) {
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(null, "No se Elimino");
}
}
}
PersonaVo.java
package modelo.vo;
public class PersonaVo {
private Integer idPersona;
private String nombrePersona;
private Integer edadPersona;
private String profesionPersona;
private Integer telefonoPersona;
/**
* @return the idPersona
*/
public Integer getIdPersona() {
return idPersona;
}
/**
* @param idPersona the idPersona to set
*/
public void setIdPersona(Integer idPersona) {
this.idPersona = idPersona;
}
/**
* @return the nombrePersona
*/
import modelo.vo.PersonaVo;
import controlador.Coordinador;
public class VentanaBuscar extends JFrame implements ActionListener {
private Coordinador miCoordinador; //objeto miCoordinador que permite
la relacion entre esta clase y la clase coordinador
private JLabel labelTitulo;
private JTextField
textCod,textNombre,textEdad,textTelefono,textProfesion;
private JLabel cod,nombre,edad,telefono,profesion;
private JButton
botonGuardar,botonCancelar,botonBuscar,botonModificar,botonEliminar;
/**
* constructor de la clase donde se inicializan todos los componentes
* de la ventana de busqueda
*/
public VentanaBuscar() {
botonGuardar = new JButton();
botonGuardar.setBounds(50, 220, 120, 25);
botonGuardar.setText("Guardar");
botonCancelar = new JButton();
botonCancelar.setBounds(190, 250, 120, 25);
botonCancelar.setText("Cancelar");
botonBuscar = new JButton();
botonBuscar.setBounds(170, 80, 50, 25);
botonBuscar.setText("Ok");
botonEliminar = new JButton();
botonEliminar.setBounds(330, 220, 120, 25);
botonEliminar.setText("Eliminar");
botonModificar = new JButton();
botonModificar.setBounds(190, 220, 120, 25);
botonModificar.setText("Modificar");
labelTitulo = new JLabel();
labelTitulo.setText("ADMINISTRAR PERSONAS");
labelTitulo.setBounds(120, 20, 380, 30);
labelTitulo.setFont(new java.awt.Font("Verdana", 1, 18));
cod=new JLabel();
cod.setText("Codigo");
cod.setBounds(20, 80, 80, 25);
add(cod);
nombre=new JLabel();
nombre.setText("Nombre");
nombre.setBounds(20, 120, 80, 25);
add(nombre);
telefono=new JLabel();
telefono.setText("telefono");
telefono.setBounds(290, 160, 80, 25);
add(telefono);
profesion=new JLabel();
profesion.setText("profesion");
profesion.setBounds(20, 160, 80, 25);
add(profesion);
edad=new JLabel();
edad.setText("Edad");
edad.setBounds(290, 120, 80, 25);
add(edad);
textCod=new JTextField();
textCod.setBounds(80, 80, 80, 25);
add(textCod);
textNombre=new JTextField();
textNombre.setBounds(80, 120, 190, 25);
add(textNombre);
textTelefono=new JTextField();
textTelefono.setBounds(340, 160, 80, 25);
add(textTelefono);
textProfesion=new JTextField();
textProfesion.setBounds(80, 160, 190, 25);
add(textProfesion);
textEdad=new JTextField();
textEdad.setBounds(340, 120, 80, 25);
add(textEdad);
botonModificar.addActionListener(this);
botonEliminar.addActionListener(this);
botonBuscar.addActionListener(this);
botonGuardar.addActionListener(this);
botonCancelar.addActionListener(this);
add(botonCancelar);
add(botonBuscar);
add(botonModificar);
add(botonEliminar);
add(botonGuardar);
add(labelTitulo);
limpiar();
setSize(480, 320);
setTitle("CoDejaVu : Patrones de Diseo/MVC");
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
}
public void setCoordinador(Coordinador miCoordinador) {
this.miCoordinador=miCoordinador;
}
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==botonGuardar)
{
try {
PersonaVo miPersona=new PersonaVo();
miPersona.setIdPersona(Integer.parseInt(textCod.getText()));
miPersona.setNombrePersona(textNombre.getText());
miPersona.setTelefonoPersona(Integer.parseInt(textTelefono.getText()));
miPersona.setEdadPersona(Integer.parseInt(textEdad.getText()));
miPersona.setProfesionPersona(textProfesion.getText());
miCoordinador.modificarPersona(miPersona);
if (Logica.modificaPersona==true) {
habilita(true, false, false, false, false, true,
false, true, true);
}
} catch (Exception e2) {
JOptionPane.showMessageDialog(null,"Error en el
Ingreso de Datos","Error",JOptionPane.ERROR_MESSAGE);
}
}
if (e.getSource()==botonBuscar)
{
PersonaVo
miPersona=miCoordinador.buscarPersona(textCod.getText());
if (miPersona!=null)
{
muestraPersona(miPersona);
}
else if(Logica.consultaPersona==true){
JOptionPane.showMessageDialog(null, "La
persona no Existe","Advertencia",JOptionPane.WARNING_MESSAGE);
}
}
if (e.getSource()==botonModificar)
{
habilita(false, true, true, true, true, false, true, false, false);
}
if (e.getSource()==botonEliminar)
{
if (!textCod.getText().equals(""))
{
int respuesta =
JOptionPane.showConfirmDialog(this,
"Esta seguro de eliminar la
Persona?", "Confirmacin",
JOptionPane.YES_NO_OPTION);
if (respuesta == JOptionPane.YES_NO_OPTION)
{
miCoordinador.eliminarPersona(textCod.getText());
limpiar();
}
}
else{
JOptionPane.showMessageDialog(null, "Ingrese un
numero de Documento", "Informacin",JOptionPane.WARNING_MESSAGE);
}
}
if (e.getSource()==botonCancelar)
{
this.dispose();
}
}
/**
* permite cargar los datos de la persona consultada
* @param miPersona
*/
private void muestraPersona(PersonaVo miPersona) {
textNombre.setText(miPersona.getNombrePersona());
textEdad.setText(miPersona.getEdadPersona()+"");
textTelefono.setText(miPersona.getTelefonoPersona()+"");
textProfesion.setText(miPersona.getProfesionPersona());
habilita(true, false, false, false, false, true, false, true, true);
}
/**
* Permite limpiar los componentes
*/
public void limpiar()
{
textCod.setText("");
textNombre.setText("");
textEdad.setText("");
textTelefono.setText("");
textProfesion.setText("");
habilita(true, false, false, false, false, true, false, true, true);
}
/**
* Permite habilitar los componentes para establecer una modificacion
* @param codigo
* @param nombre
* @param edad
* @param tel
* @param profesion
* @param cargo
* @param bBuscar
* @param bGuardar
* @param bModificar
* @param bEliminar
*/
public void habilita(boolean codigo, boolean nombre, boolean edad,
boolean tel, boolean profesion,
boolean bBuscar, boolean bGuardar,
boolean bModificar, boolean bEliminar)
{
textCod.setEditable(codigo);
textNombre.setEditable(nombre);
textEdad.setEditable(edad);
textTelefono.setEditable(tel);
textProfesion.setEditable(profesion);
botonBuscar.setEnabled(bBuscar);
botonGuardar.setEnabled(bGuardar);
botonModificar.setEnabled(bModificar);
botonEliminar.setEnabled(bEliminar);
}
}
VentanaPrincipal.java
package vista;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import controlador.Coordinador;
public class VentanaPrincipal extends JFrame implements ActionListener{
private Coordinador miCoordinador; //objeto miCoordinador que permite
la relacion entre esta clase y la clase coordinador
private JTextArea areaIntroduccion;
private JLabel labelTitulo, labelSeleccion;
private JButton botonRegistrar,botonBuscar;
/**
* Establece la informacion que se presentara como introduccion del
sistema
*/
public String textoIntroduccion = "";
/**
* constructor de la clase donde se inicializan todos los componentes
* de la ventana principal
*/
public VentanaPrincipal() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
botonRegistrar = new JButton();
botonRegistrar.setBounds(100, 280, 120, 25);
botonRegistrar.setText("Registrar");
botonBuscar = new JButton();
botonBuscar.setBounds(240, 280, 120, 25);
botonBuscar.setText("Buscar");
labelTitulo = new JLabel();
labelTitulo.setText("PATRON MODELO VISTA
CONTROLADOR");
labelTitulo.setBounds(60, 40, 380, 30);
labelTitulo.setFont(new java.awt.Font("Verdana", 1, 15));
labelSeleccion = new JLabel();
labelSeleccion.setText("Escoja que operacion desea realizar");
labelSeleccion.setBounds(75, 240, 250, 25);
textoIntroduccion = "Esta aplicacin presenta un ejemplo
prctico del patron "
+ "de diseo MVC.\n\n"
+ "La aplicacin permite registrar, actualizar,
buscar y eliminar registros de una tabla Persona." +
"tambien son vinculados algunos conceptos de los
Patrones Value Object y Data Access Objetc\n";
areaIntroduccion = new JTextArea();
areaIntroduccion.setBounds(50, 90, 380, 140);
areaIntroduccion.setEditable(false);
areaIntroduccion.setFont(new java.awt.Font("Verdana", 0, 14));
areaIntroduccion.setLineWrap(true);
areaIntroduccion.setText(textoIntroduccion);
areaIntroduccion.setWrapStyleWord(true);
areaIntroduccion.setBorder(javax.swing.BorderFactory.createBevelBorder(
javax.swing.border.BevelBorder.LOWERED, null,
null, null,
new java.awt.Color(0, 0, 0)));
botonRegistrar.addActionListener(this);
botonBuscar.addActionListener(this);
add(botonBuscar);
add(botonRegistrar);
add(labelSeleccion);
add(labelTitulo);
add(areaIntroduccion);
setSize(480, 350);
setTitle("CoDejaVu : Patrones de Diseo/MVC");
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
}
public void setCoordinador(Coordinador miCoordinador) {
this.miCoordinador=miCoordinador;
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource()==botonRegistrar) {
miCoordinador.mostrarVentanaRegistro();
}
if (e.getSource()==botonBuscar) {
miCoordinador.mostrarVentanaConsulta();
}
}
}
VentanaRegistro.java
package vista;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import modelo.vo.PersonaVo;
import controlador.Coordinador;
public class VentanaRegistro extends JFrame implements ActionListener{
private Coordinador miCoordinador; //objeto miCoordinador que permite
la relacion entre esta clase y la clase coordinador
private JLabel labelTitulo;
private JTextField
textCod,textNombre,textEdad,textTelefono,textProfesion;
private JLabel cod,nombre,edad,telefono,profesion;
private JButton botonGuardar,botonCancelar;
/**
* constructor de la clase donde se inicializan todos los componentes
* de la ventana de registro
*/
public VentanaRegistro() {
botonGuardar = new JButton();
botonGuardar.setBounds(110, 220, 120, 25);
botonGuardar.setText("Registrar");
botonCancelar = new JButton();
botonCancelar.setBounds(250, 220, 120, 25);
botonCancelar.setText("Cancelar");
labelTitulo = new JLabel();
labelTitulo.setText("REGISTRO DE PERSONAS");
labelTitulo.setBounds(120, 20, 380, 30);
labelTitulo.setFont(new java.awt.Font("Verdana", 1, 18));
cod=new JLabel();
cod.setText("Codigo");
cod.setBounds(20, 80, 80, 25);
add(cod);
nombre=new JLabel();
nombre.setText("Nombre");
nombre.setBounds(20, 120, 80, 25);
add(nombre);
telefono=new JLabel();
telefono.setText("telefono");
telefono.setBounds(290, 160, 80, 25);
add(telefono);
edad=new JLabel();
edad.setText("Edad");
edad.setBounds(290, 120, 80, 25);
add(edad);
profesion=new JLabel();
profesion.setText("Profesion");
profesion.setBounds(20, 160, 80, 25);
add(profesion);
textCod=new JTextField();
textCod.setBounds(80, 80, 80, 25);
add(textCod);
textNombre=new JTextField();
textNombre.setBounds(80, 120, 190, 25);
add(textNombre);
textTelefono=new JTextField();
textTelefono.setBounds(340, 160, 80, 25);
add(textTelefono);
textEdad=new JTextField();
textEdad.setBounds(340, 120, 80, 25);
add(textEdad);
textProfesion=new JTextField();
textProfesion.setBounds(80, 160, 190, 25);
add(textProfesion);
botonGuardar.addActionListener(this);
botonCancelar.addActionListener(this);
add(botonCancelar);
add(botonGuardar);
add(labelTitulo);
limpiar();
setSize(480, 300);
setTitle("CoDejaVu : Patrones de Diseo/MVC");
setLocationRelativeTo(null);
setResizable(false);
setLayout(null);
}
private void limpiar()
{
textCod.setText("");
textNombre.setText("");
textEdad.setText("");
textTelefono.setText("");
textProfesion.setText("");
}
public void setCoordinador(Coordinador miCoordinador) {
this.miCoordinador=miCoordinador;
}
@Override
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==botonGuardar)
{
try {
PersonaVo miPersona=new PersonaVo();
miPersona.setIdPersona(Integer.parseInt(textCod.getText()));
miPersona.setNombrePersona(textNombre.getText());
miPersona.setTelefonoPersona(Integer.parseInt(textTelefono.getText()));
miPersona.setEdadPersona(Integer.parseInt(textEdad.getText()));
miPersona.setProfesionPersona(textProfesion.getText());
miCoordinador.registrarPersona(miPersona);
} catch (Exception ex) {
JOptionPane.showMessageDialog(null,"Error en el
Ingreso de Datos","Error",JOptionPane.ERROR_MESSAGE);
}
}
if (e.getSource()==botonCancelar)
{
this.dispose();
}
}
}
Coordinador.java
package controlador;
import modelo.Logica;
import modelo.dao.PersonaDao;
import modelo.vo.PersonaVo;
import vista.VentanaBuscar;
import vista.VentanaPrincipal;
import vista.VentanaRegistro;
public class Coordinador {
private Logica miLogica;
private VentanaPrincipal miVentanaPrincipal;
private VentanaRegistro miVentanaRegistro;
private VentanaBuscar miVentanaBuscar;
public VentanaPrincipal getMiVentanaPrincipal() {
return miVentanaPrincipal;
}
public void setMiVentanaPrincipal(VentanaPrincipal miVentanaPrincipal)
{
this.miVentanaPrincipal = miVentanaPrincipal;
}
public VentanaRegistro getMiVentanaRegistro() {
return miVentanaRegistro;
}
public void setMiVentanaRegistro(VentanaRegistro miVentanaRegistro)
{
this.miVentanaRegistro = miVentanaRegistro;
}
public VentanaBuscar getMiVentanaBuscar() {
return miVentanaBuscar;
}
public void setMiVentanaBuscar(VentanaBuscar miVentanaBuscar) {
this.miVentanaBuscar = miVentanaBuscar;
}
public Logica getMiLogica() {
return miLogica;
}
public void setMiLogica(Logica miLogica) {
this.miLogica = miLogica;
}
//////////////////////////////////////////////////////////
public void mostrarVentanaRegistro() {
miVentanaRegistro.setVisible(true);
}
public void mostrarVentanaConsulta() {
miVentanaBuscar.setVisible(true);
}
public void registrarPersona(PersonaVo miPersona) {
miLogica.validarRegistro(miPersona);
}
public PersonaVo buscarPersona(String codigoPersona) {
return miLogica.validarConsulta(codigoPersona);
}
public void modificarPersona(PersonaVo miPersona) {
miLogica.validarModificacion(miPersona);
}
public void eliminarPersona(String codigo) {
miLogica.validarEliminacion(codigo);
}
}
Principal.java
package controlador;
import modelo.Logica;
import vista.VentanaBuscar;
import vista.VentanaPrincipal;
import vista.VentanaRegistro;
public class Principal {
Logica miLogica;
VentanaPrincipal miVentanaPrincipal;
VentanaBuscar miVentanaBuscar;
VentanaRegistro miVentanaRegistro;
Coordinador miCoordinador;
/**
* @param args
*/
public static void main(String[] args) {
Principal miPrincipal=new Principal();
miPrincipal.iniciar();
}
/**
* Permite instanciar todas las clases con las que trabaja
* el sistema
*/
private void iniciar() {
/*Se instancian las clases*/
miVentanaPrincipal=new VentanaPrincipal();
miVentanaRegistro=new VentanaRegistro();
miVentanaBuscar= new VentanaBuscar();
miLogica=new Logica();
miCoordinador= new Coordinador();
Patrones
estructurales
El objetivo de los
patrones
de
estructurales
es
facilitar
la
independencia de
la interfaz de un
objeto o de un conjunto de objetos respecto de su implementacin. En el caso de un
conjunto de objetos, se trata tambin de hacer que esta interfaz sea independiente de la
jerarqua de clases y de la composicin de los objetos.
Proporcionando interfaces, los patrones de estructuracin encapsulan la composicin de
objetos, aumentan el nivel de abstraccin del sistema de forma similar a como los
patrones de creacin encapsulan la creacin de objetos. Los patrones de estructuracin
ponen de relieve las interfaces.
La encapsulacin de la composicin no se realiza estructurando el objeto en s mismo
sino transfiriendo esta estructuracin a un segundo objeto. ste queda ntimamente
ligado al primero. Esta transferencia de estructuracin significa que el primer objeto
posee la interfaz de cara a los clientes y administra la relacin con el segundo objeto que
gestiona la composicin y no tiene ninguna interfaz con los clientes externos.
Esta realizacin ofrece otra mejora que es la flexibilidad en la composicin, la cual
puede modificarse de manera dinmica. En efecto, es sencillo sustituir un objeto por
otro siempre que sea de la misma clase o que respete la misma interfaz.
Composite :
Sirve para construir objetos complejos a partir de otros ms simples y similares
entre s, gracias a la composicin recursiva y a una estructura en forma de rbol.
Esto simplifica el tratamiento de los objetos creados, ya que al poseer todos ellos
una interfaz comn, se tratan todos de la misma manera.
En clase observamos el siguiente ejemplo mostrado en el siguiente diagrama:
<<Interface>>
Fichero
+calcularEspacio(): double
+Operation()
+Add(Parameter1: Fichero)
+Remove(Parameter1: Fichero)
+GetChild(int)
1
Archivo
-nombre: String
-espacio: double
+Archivo()
+Archivo(n: String, e: double)
+getEspacio(): double
+setEspacio(double espacio)
+calcularEspacio(): double
Carpeta
-ficheros: ArrayList<Fichero>
+Carpeta()
+agregar(f: Fichero)
+calcularEspacio(): double
En este
ejemplo
nos
permite calcular el espacio tratando de la misma forma las carpetas y archivos,
utiliza los objetos para realizar los clculos.
Cdigo fuente de ejemplo en clase:
Archivo.java
public class Archivo implements Fichero{
private String nombre;
private double espacio;
public Archivo(){this.espacio=0.0;}
public Archivo(String n,double e){
this.nombre=n;
this.espacio=e;
}
public double getEspacio(){
return espacio;
}
public void setEspacio(double espacio) {
this.espacio = espacio;
}
public double calcularEspacio(){
return this.espacio;
}
}
Carpeta.java
import java.util.ArrayList;
public class Carpeta implements Fichero{
private ArrayList<Fichero> ficheros;
public Carpeta(){
ficheros = new ArrayList<Fichero>();
}
<<Interface>>
Empleado
+getNombre(): String
+getSalario(): double
+add(empleado: Empleado)
+imprimir()
Revelador
Gerente
-nombre: String
-salario: double
+empleado: ArrayList<Empleado>
+Gerente(nombre: String, salario: double)
+getChild(int i): Empleado
+getNombre(): String
+getSalario(): double
+imprimir()
+nombre: String
+salario: double
+Revelador(nombre: String, salario: double)
+getChild(int i): Empleado
+getNombre(): String
+getSalario(): double
+imprimir()
Cdigo fuente
Empleado.java
public interface Empleado {
public void add(Empleado empleado);
public Empleado getChild(int i);
public String getNombre();
public double getSalario();
public void imprimir();
}
Gerente.java
import java.util.ArrayList;
import java.util.Iterator;
public class Gerente implements Empleado{
private String nombre;
private double salario;
public Gerente(String nombre,double salario){
this.nombre = nombre;
this.salario = salario;
}
ArrayList<Empleado> empleado = new ArrayList<Empleado>();
public void add(Empleado empleados) {
empleado.add(empleados);
}
public Empleado getChild(int i) {
return empleado.get(i);
}
public String getNombre() {
return nombre;
}
public double getSalario() {
return salario;
}
Ejemplo2
Empresa
+agregaVehiculo()
+calculaCosteMantenimiento()
+agregaFilial()
1..*
EmpresaSinFilial
EmpresaMadre
+calculaCosteMantenimiento()
+calculaCosteMantenimiento()
+agregaFilial()
Cdigo
Fuente
Empresa.java
public abstract class Empresa{
protected static double costeUnitarioVehiculo = 5.0;
protected int nVehiculos;
public void agregaVehiculo(){
nVehiculos = nVehiculos + 1;
}
public abstract double calculaCosteMantenimiento();
public abstract boolean agregaFilial(Empresa filial);
}
EmpresaSinFilial.java
public class EmpresaSinFilial extends Empresa{
public boolean agregaFilial(Empresa filial){
return false;
}
public double calculaCosteMantenimiento(){
return nVehiculos * costeUnitarioVehiculo;
}
}
EmpresaMadre.java
import java.util.*;
public class EmpresaMadre extends Empresa{
protected List<Empresa> filiales = new ArrayList<Empresa>();
public boolean agregaFilial(Empresa filial){
return filiales.add(filial);
}
public double calculaCosteMantenimiento(){
double coste = 0.0;
for (Empresa filial: filiales)
coste = coste + filial.calculaCosteMantenimiento();
return coste + nVehiculos * costeUnitarioVehiculo;
}
}
Main.java
public class Main
{
public static void main(String[] args) {
Empresa empresa1 = new EmpresaSinFilial();
empresa1.agregaVehiculo();
Empresa empresa2 = new EmpresaSinFilial();
empresa2.agregaVehiculo();
empresa2.agregaVehiculo();
Empresa grupo = new EmpresaMadre();
grupo.agregaFilial(empresa1);
grupo.agregaFilial(empresa2);
grupo.agregaVehiculo();
System.out.println("Coste de mantenimiento total del grupo: "
+grupo.calculaCosteMantenimiento());
}
}
Resultado del cdigo
Decorator :
Responde a la necesidad de aadir dinmicamente funcionalidad a un Objeto.
Esto nos permite no tener que crear sucesivas clases que hereden de la primera
incorporando la nueva funcionalidad, sino otras que la implementan y se asocian
a la primera.
En clase observamos el siguiente ejemplo mostrado en el diagrama de clase:
<<Abstarct>>
Combo
#descripcion = "":String
+getDescripcion(): String
+calcularCosto(): double
<<Abstract>>
AdicionalDecorador
ComboBasico
+getDescripcion(): String
+ComboBasico()
+calcularCosto(): double
+Operation()
Carne
fuente
clase
de
PapasFritas
+combo: Combo
+combo: Combo
+Carne(combo: Combo)
+getDescripcion(): String
+PapasFritas(combo: Combo)
+getDescripcion(): String
AdicionalDecorador.java
public abstract class AdicionalDecorador extends Combo{
public abstract String getDescripcion();
}
Carne.java
public class Carne extends AdicionalDecorador {
private Combo combo;
public Carne(Combo combo) {
this.combo = combo;
}
Cdigo
ejemplo en
@Override
public String getDescripcion() {
return combo.getDescripcion() + " , Porcion de Carne";
}
@Override
public double calcularCosto() {
return 2.0 + combo.calcularCosto();
}
}
Combo.java
public abstract class Combo {
protected String descripcion = "";
public String getDescripcion() {
return descripcion;
}
public abstract double calcularCosto();
}
ComboBasico.java
public class ComboBasico extends Combo {
public ComboBasico() {
descripcion = "Porcion de Papas Fritas, "
+ "salsa, queso, hamburguesa sencilla, gaseosa";
}
@Override
public double calcularCosto() {
return 5.0;
}
}
PapasFritas.java
public class PapasFritas extends AdicionalDecorador {
private Combo combo;
public PapasFritas(Combo combo) {
this.combo = combo;
}
@Override
public String getDescripcion() {
return combo.getDescripcion() + " , Porcion de papas fritas";
}
@Override
public double calcularCosto() {
return 1.0 + combo.calcularCosto();
}
}
Principal.java
public class Principal {
public static void main(String[] args) {
Combo combo=new ComboBasico();
System.out.println(combo.getDescripcion());
System.out.println(combo.calcularCosto());
combo = new Carne(combo);
System.out.println(combo.getDescripcion());
System.out.println(combo.calcularCosto());
combo = new PapasFritas(combo);
System.out.println(combo.getDescripcion());
System.out.println(combo.calcularCosto());
combo = new PapasFritas(combo);
System.out.println(combo.getDescripcion());
System.out.println(combo.calcularCosto());
}
}
A continuacin mostraremos los diagramas de clase de dos ejemplos de este
patrn
Ejemplo 1
<<Interface>>
IVentana
+dibujar(columna: int, fila: int)
<<abstract>>
DecoradorDesplazamiento
Ventana
+Ventana()
Cdigo
fuente
+DecoradorDesplazamiento(IVenta: v)
DecoradorDesplazamientoHoriz
DecoradorDesplazamientoVert
+DecoradorDesplazamientoHoriz(IVentana: v)
+dibujar(col: int, fila: int)
+dibujarBarraDespHorizontal()
+DecoradorDesplazamientoHoriz(IVentana: v)
+dibujar(col: int, fila: int)
+dibujarBarraDespVertical()
}
IVentana.java
public interface IVentana
{
public void dibujar(int columna, int fila);
}
DecoradorDesplazamiento.java
public abstract class DecoradorDesplazamiento implements IVentana
{
protected IVentana v;
public DecoradorDesplazamiento( IVentana v )
{
this.setVentana( v );
}
public IVentana getVentana()
{
return this.v;
}
public void setVentana( IVentana v )
{
this.v = v;
}
@Override
public void dibujar(int col, int fila)
{
this.getVentana().dibujar(col, fila);
}
}
DecoradorDesplazamientoHoriz.java
public class DecoradorDesplazamientoHoriz extends DecoradorDesplazamiento
{
public DecoradorDesplazamientoHoriz( IVentana v )
{
super( v );
}
@Override
public void dibujar(int col, int fila)
{
// Dibujar la ventana
this.getVentana().dibujar(col, fila);
// Agregar barra de desplazamiento
this.dibujarBarraDespHorizontal();
}
private void dibujarBarraDespHorizontal()
{
Ejemplo 2
<<interface>>
ComponenteGraficoVehiculo
VistaCatalogo
+component
+visualiza()
VistaVehiculo
+visualiza()
Decorador
#componente: ComponenteGraficoVehiculo
+Decorador(componente: ComponenteGraficoVehiculo)
+visualiza()
MarcaDecorador
ModeloDecorador
+MarcaDecorador(componente: ComponenteGraficoVehiculo)
+Operation1()
#visualizaLogo()
+ModeloDecorador(componente: ComponenteGraficoVehiculo)
+visualiza()
#visualizaInformacionTecnica()
Cdigo fuente
ComponenteGraficoVehiculo.java
public interface ComponenteGraficoVehiculo {
void visualiza();
}
Decorador.java
public class Decorador implements ComponenteGraficoVehiculo{
protected ComponenteGraficoVehiculo componente;
public Decorador(ComponenteGraficoVehiculo componente){
this.componente = componente;
}
public void visualiza(){
componente.visualiza();
}
}
VistaVehiculo.java
public class VistaVehiculo implements ComponenteGraficoVehiculo{
public void visualiza(){
System.out.println("Visualizacin del vehculo");
}
}
MarcaDecorador.java
public class MarcaDecorador extends Decorador{
public MarcaDecorador(ComponenteGraficoVehiculo componente){
super(componente);
}
protected void visualizaLogo(){
System.out.println("Logotipo de la marca");
}
public void visualiza(){
super.visualiza();
this.visualizaLogo();
}
}
ModeloDecorador.java
public class ModeloDecorador extends Decorador{
public ModeloDecorador(ComponenteGraficoVehiculo componente){
super(componente);
}
protected void visualizaInformacionTecnica(){
System.out.println("Informacin tcnica del modelo");
}
public void visualiza(){
super.visualiza();
this.visualizaInformacionTecnica();
}
}
VistaCatalogo.java
public class VistaCatalogo {
public static void main(String[] args){
VistaVehiculo vistaVehiculo = new VistaVehiculo();
ModeloDecorador modeloDecorador = new
ModeloDecorador(vistaVehiculo);
MarcaDecorador marcaDecorador = new
MarcaDecorador(modeloDecorador);
marcaDecorador.visualiza();
}
}
Al ejecutar el cdigo obtenemos:
Facade :
Permite simplificar el interface de comunicacin entre dos objetos X y Z de tal
forma que para el objeto X sea ms sencillo interactuar con el objeto Z. De esta
manera el cliente solo se conecta con una interface sencilla, mientras que la
interface sencilla se conecta a su vez a otras interfaces ms complejas.
Cdigo fuente de ejmplo en clase
Aplicacin.java
import java.util.Random;
public class Aplicacion {
private String nombre;
public Aplicacion(){
this.nombre="NN";
}
public Aplicacion(String nombre){this.nombre=nombre;}
public void ejecutar(){
System.out.println("Ejecutando aplicacion"+getNombre());
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
CPU.java
public class CPU {
ArrayList<Proceso> procesos = new ArrayList<Proceso>();
public void procesar() {
System.out.println("Procesando");
procesos.add(new Proceso());
procesos.add(new Proceso());
procesos.add(new Proceso());
procesos.add(new Proceso());
procesos.add(new Proceso());
procesos.add(new Proceso());
for(Proceso proceso:procesos){
proceso.ejecutar();
}
}
}
DiscoDuro.java
public class DiscoDuro {
private String espacio="1.5TB";
public void leerInfo() { System.out.println("Leyendo
duro"+getEspacio());}
public String getEspacio() {
return espacio;
}
public void setEspacio(String espacio) {
disco
this.espacio = espacio;
}
}
Memoria.java
public class Memoria {
private String espacio="4GB";
public void cargar() { System.out.println("Cargando espacio de
memoria"+getEspacio());}
public String getEspacio() {
return espacio;
}
public void setEspacio(String espacio) {
this.espacio = espacio;
}
}
Proceso.java
import java.util.Random;
public class Proceso {
private String nombre;
public Proceso(){
this.nombre="Proc"+new Random().nextDouble();
}
public void ejecutar(){
System.out.println("Procesando "+getNombre());
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
SistemaOperativo.java
import java.util.ArrayList;
public class SistemaOperativo {
CPU cpu;
Memoria memoria;
DiscoDuro discoDuro;
ArrayList<Aplicacion> aplicaciones = new ArrayList<Aplicacion>();
public SistemaOperativo() {
this.cpu = new CPU();
this.discoDuro = new DiscoDuro();
this.memoria = new Memoria();
aplicaciones.add(new Aplicacion("Servicios"));
aplicaciones.add(new Aplicacion("Escritorio"));
aplicaciones.add(new Aplicacion("Explorador"));
aplicaciones.add(new Aplicacion("Entorno de red"));
aplicaciones.add(new Aplicacion("Herramientas administrativas"));
aplicaciones.add(new Aplicacion("Ofimtica"));
}
public void cargar() {
cpu.procesar();
memoria.cargar();
discoDuro.leerInfo();
for(Aplicacion app:aplicaciones){
app.ejecutar();
}
System.out.println("Carga finalizada");
}
}
Principal.java
public class Principal {
public static void main(String[] args) {
SistemaOperativo SO = new SistemaOperativo();
SO.cargar();
}
}
A continuacin tenemos los siguientes ejemplos de este patrn
Ejemplo1
Facade
Arrancar
+Arrancar()
+encenderContacto()
-liquidos: ComprobarLiquidos
-asiento: ComprobarAsiento
-espejos: ComprobarEspejos
-arrancar: Arrancar
ComprobarAsiento
+ComprobarAsiento()
+Comprobar()
+Facade()
+arrancarCoche()
ComprobarEspejos
ComprobarLiquidos
+ComprobarLiquidos()
+comprobar()
Facade.java
public class Facade
{
private ComprobarLiquidos liquidos;
private ComprobarAsiento asiento;
private ComprobarEspejos espejos;
private Arrancar arrancar;
// -------------------------------public Facade()
{
this.liquidos = new ComprobarLiquidos();
+ComprobarEspejos()
+Comprobar()
Cdigo
fuente
Patrones de comportamiento
Los patrones de estructuracin aportan soluciones a los problemas de estructuracin de
datos y de objetos.
El objetivo de los patrones de comportamiento consiste en proporcionar soluciones para
distribuir el procesamiento y los algoritmos entre los objetos.
Estos patrones organizan los objetos as como sus interacciones especificando los flujos de
control y de procesamiento en el seno de un sistema de objetos.
Observer :
Define una dependencia del tipo uno a muchos entre objetos, de manera que
cuando uno de los objetos cambia su estado, notifica este cambio a todos los
dependientes.
Este patrn tambin se conoce como el patrn de publicacin
inscripcin o modelo patrn. Estos nombres sugieren las ideas bsicas del
patrn, que son: el objeto de datos, que se le puede llamar Sujeto a partir de
ahora, contiene atributos mediante los cuales cualquier objeto Observador o vista
se puede suscribir a l pasndole una referencia a s mismo. El Sujeto mantiene
as una lista de las referencias a sus observadores. Los observadores a su vez
estn obligados a implementar unos mtodos determinados mediante los cuales
el Sujeto es capaz de notificar a sus observadores suscritos los cambios que sufre
para que todos ellos tengan la oportunidad de refrescar el contenido
representado.
En clase observamos el siguiente ejemplo mostrado en el siguiente diagrama de
clase:
<<Interface>>
Sujeto
<<Interface>>
Observador
+update(availability: String) +subject
+Update()
+registerObserver(observer: Observador)
+removeObserver(observer: Observador)
+notifyObservers()
persona
Producto
-observadores: ArrayList<Observador>
-nombre: String
-tipo: String
+existencia: String
-nombre: String
sujeto
elimina y
+Producto(n: String, t: String, e: String)
+getObservers(): ArrayList<Observador>
cualquier
+setObservers(observers: ArrayList<Observador>)
+getNombre(): String
realizado.
+setNombre(n: String)
+getTipo(): String
A
+setTipo(t: String)
se muestra
fuente del
hecho en clase:
Observador.java
public interface Observador {
public void update(String availability);
}
Sujeto.java
public class Persona implements Observador{
String nombre;
public Persona(String n) {
this.nombre = n;
}
+persona(n: String)
+getNombre(): String
+setNombre(n: String)
+update(existencia: String)
A travs de
agrega,
notifica
cambio
continuacin
el cdigo
ejemplo
String existencia;
public Producto(String n, String t,String e) {
super();
this.nombre = n;
this.tipo = t;
this.existencia=e;
}
public ArrayList<Observador> getObservers() {
return observadores;
}
public void setObservers(ArrayList<Observador> observers) {
this.observadores = observers;
}
public String getNombre() {
return nombre;
}
public void setNombre(String n) {
this.nombre = n;
}
public String getTipo() {
return tipo;
}
public void setTipo(String t) {
this.tipo = t;
}
public String getExistencia() {
return existencia;
}
public void setExistencia(String e) {
this.existencia = e;
notifyObservers();
}
public void notifyObservers() {
System.out.println("Notificando a todos los
observadores");
for (Observador ob : observadores) {
ob.update(this.existencia );
}
}
public void registerObserver(Observador observer) {
observadores.add(observer);
}
public void removeObserver(Observador observer) {
observadores.remove(observer);
}
}
Principal.java
public class Principal {
Tiempo
-segundos: int
-minutos: int
-hora: int
-hiloDeEjecucion: Thread
-observes: ArrayList<IObserver>
ObservadorGrafico
+lblHora: J Label
+observable: IObservable
+panelContenedor: J Panel
+addObserver(observer: IObserver)
+getHora(): int
+getMinutos(): int
+getSegundos(): int
-notificar()
+removeObserver(observer: IObserver)
+run()
+setHora(hora: int)
+setMinutos(minutos: int)
+setSegundos(segunddos: int)
+start()
+toString(): String
+update()
-initComponents()
<<interface>>
I Observer
+update()
<<interface>>
I Observable
+addObserver(observer: IObserver)
+removeObserver(observer: I Observer)
Cdigo fuente
ObservadorDeConsola.java
public class ObservadorDeConsola implements IObserver {
private IObservable observable;
/**
* Constructor unico de la clase ObservadorDeConsola.
* @param observable IObservable a observar.
*/
public ObservadorDeConsola(IObservable observable) {
this.observable = observable;
this.observable.addObserver(this);
}
/**
* Metodo implementado de la interfaz IObserver que muestra por consola el
* objeto observable como una cadena.
*/
@Override
public void update() {
System.out.println("" + observable.toString());
}
}
Tiempo.java
public class Tiempo implements IObservable, Runnable {
private int segundos;
private int minutos;
private int hora;
private Thread hiloDeEjecucion;
private ArrayList<IObserver> observers;
/**
* Constructor unico de objetos de la clase Tiempo.
*
* @param segundos numero entero que representa los segundos.
* @param minutos numero entero que representa los minutos.
* @param horas numero entero que representa la hora del dia.
*/
public Tiempo(int hora, int minutos, int segundos) {
this.segundos = segundos;
this.minutos = minutos;
this.hora = hora;
this.observers = new ArrayList<IObserver>();
}
/**
* Metodo para insertar un nuevo IObserver para responder a los cambios de
* estado.
*
* @param observer objeto IObserver que se desea insertar.
*/
@Override
public void addObserver(IObserver observer) {
observers.add(observer);
}
/**
* Metodo para eliminar un IObserver del ArrayList de observadores del
* estado del objeto.
*
return minutos;
}
/**
* Getter de los segundos.
*
* @return int segundos.
*/
public int getSegundos() {
return segundos;
}
/**
* Getter del ArrayList con los observadores del estado del objeto.
*
* @return ArrayList<IObserver> observers.
*/
public ArrayList<IObserver> getObservers() {
return observers;
}
/**
* Sobreescritura del metodo toString() de la clase Object que define la
* representacion de este objeto como una cadena.
*
* @return String objeto tiempo en modo de cadena de texto.
*/
@Override
public String toString() {
return (getHora() < 10 ? "0" + getHora() : getHora()) + ":" +
(getMinutos() < 10 ? "0" + getMinutos() : getMinutos()) + ":" +
(getSegundos() < 10 ? "0" + getSegundos() : getSegundos());
}
private void notificar() {
for (Iterator<IObserver> it = observers.iterator(); it.hasNext();) {
IObserver iObserver = it.next();
iObserver.update();
}
}
/**
* Metodo que inicia la ejecucion del hilo con el comportamiento definido.
*/
public void start() {
hiloDeEjecucion = new Thread(this);
hiloDeEjecucion.start();
}
/**
void update();
}
IObservable.java
public interface IObservable {
void addObserver(IObserver observer);
removeObserver(IObserver observer);
}
ObservadorGrafico.java
public class ObservadorGrafico extends javax.swing.JFrame implements
IObserver {
private IObservable observable;
/**
* Constructor unico de la clase ObservadorGrafico.
*
* @param observable IObservable objeto del cual estaremos pendiendes te
los
* cambios de estado.
*/
public ObservadorGrafico(IObservable observable) {
initComponents();
setLocationRelativeTo(null);
this.observable = observable;
this.observable.addObserver(this);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
panelContenedor = new javax.swing.JPanel();
lblHora = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLO
SE);
setMaximumSize(new java.awt.Dimension(300, 100));
setMinimumSize(new java.awt.Dimension(60, 30));
panelContenedor.setMaximumSize(new java.awt.Dimension(300, 100));
panelContenedor.setMinimumSize(new java.awt.Dimension(60, 30));
panelContenedor.setPreferredSize(new java.awt.Dimension(300, 100));
lblHora.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
Strategy :
Permite disponer de varios mtodos para resolver un problema y elegir cul
utilizar en tiempo de ejecucin.
Determina cmo se debe realizar el intercambio de mensajes entre diferentes
objetos para resolver una tarea. El patrn estrategia permite mantener un
conjunto de algoritmos de entre los cuales el objeto cliente puede elegir aquel
<<Interface>>
Rol
+negociar()
Vendedor
+Vendedor()
+negociar()
Comprador
+Comprador()
+negociar()
juan.negociar();
}
}
A continuacin mostraremos dos ejemplos de este patrn.
Ejemplo1
<<abstract>>
Avion
<<interface>>
Algoritmo
-miAlgoritmo: Algoritmo
+moverse()
+setAlgoritmo(a: Algoritmo)
+mover()
EnAire
fuente
AvionComercial
AvionRapido
+moverse()
EnTierra
+moverse()
Avion.java
public abstract class Avion{
private Algoritmo miAlgoritmo;
public void setAlgoritmo(Algoritmo a){
this.miAlgoritmo = a;
}
public void mover(){
this.miAlgoritmo.moverse();
}
}
AvionComercial.java
public class AvionComercial extends Avion{
public AvionComercial(){
System.out.println("****Avion Comercial****");
}
}
AvionRapido.java
public class AvionRapido extends Avion{
public AvionRapido(){
System.out.println("****Avion Rapido****");
}
}
Algoritmo.java
public interface Algoritmo{
public void moverse();
}
EnAire.java
public class EnAire implements Algoritmo{
@Override
public void moverse(){
System.out.println("Volando en los aires");
}
}
EnTierra.java
public class EnTierra implements Algoritmo{
EnAireVeloz
+moverse()
Cdigo
@Override
public void moverse(){
System.out.println("Moviendose sobre ruedas");
}
}
EnAireVeloz.java
public class EnAireVeloz implements Algoritmo{
@Override
public void moverse(){
System.out.println("Volando muy rapido!!!");
}
}
PruebaEstrategia.java
public class PruebaEstrategia{
public static void main(String[] args){
AvionComercial avionComercial = new AvionComercial();
avionComercial.setAlgoritmo(new EnTierra());
avionComercial.mover();
avionComercial.setAlgoritmo(new EnAire());
avionComercial.mover();
System.out.println();
AvionRapido avionRapido = new AvionRapido();
avionRapido.setAlgoritmo(new EnTierra());
avionRapido.mover();
avionRapido.setAlgoritmo(new EnAireVeloz());
avionRapido.mover();
System.out.println();
}
}
Resultado de cdigo.
Ejemplo2
Singleton
+figura: Figura
-instancia: Singleton = null
if(instancia==null){
instancia=new Singleton();
}
return instancia;
-Singleton()
+getFigura(): Figura
+SetFigura(Figura figura)
+CalcularArea(): double
<<interface>>
Figura
estrategy
+CalcularArea(): Double
Circulo
-radio: double
+Circulo()
+Circulo(radio: double)
+getRadio(): double
+setRadio(radio: double)
+CalcularArea(): double
Cuadrado
-lado: double
+Cuadrado()
+Cuadrado(lado: double)
+getLado(): double
+setLado(lado: double)
+CalcularArea(): double
Rectangulo
-base: double
-altura: double
+Rectangulo()
+Rectangulo(base: double, altura: double)
+getBase(): double
+setBase(base: double)
+getAltura(): altura
+setAltura(altura: double)
+CalcularArea(): double
+Triangulo()
+Triangulo(base: double, altura: double)
+getBase(): double
+setBase(base: double)
+getAltura(): altura
+setAltura(altura: double)
+CalcularArea(): double
Cdigo Fuente
Singleton.java
public class Singleton implements Figura{
Figura figura;
private static Singleton instancia=null;
public static Singleton getInstancia(){
if(instancia==null){
instancia=new Singleton();
}
return instancia;
}
private Singleton(){
}
public Figura getFigura() {
return figura;
}
public void setFigura(Figura figura) {
this.figura = figura;
}
@Override
public double CalcularArea(){
return figura.CalcularArea();
}
}
Figura.java
public interface Figura {
public double CalcularArea();
}
Circulo.java
public class Circulo implements Figura {
private double radio;
Triangulo
-base: double
-altura: double
public Circulo() {
}
public Circulo(double radio) {
this.radio = radio;
}
public double getRadio() {
return radio;
}
public void setRadio(double radio) {
this.radio = radio;
}
@Override
public double CalcularArea(){
return Math.PI*Math.pow(radio,2);
}
}
Cuadrado.java
public class Cuadrado implements Figura{
private double lado;
public Cuadrado(){//designa valor por defeecto
}
public Cuadrado(double Lado){
this.lado = Lado;
}
public double getLado() {
return lado;
}
public void setLado(double lado) {
this.lado = lado;
}
@Override
public double CalcularArea(){
return this.lado*this.lado;
}
}
Rectangulo.java
public class Rectangulo implements Figura{
private double base, altura;
public Rectangulo(double base, double altura) {
this.base = base;
this.altura = altura;
}
public Rectangulo() {
}
public double getBase() {
return base;
}
public void setBase(double base) {
this.base = base;
}
public double getAltura() {
return altura;
}
public void setAltura(double altura) {
this.altura = altura;
}
@Override
public double CalcularArea(){
return base*altura;
}
}
Triangulo.java
public class Triangulo implements Figura{
private double base, altura;
public Triangulo(double base, double altura) {
this.base = base;
this.altura = altura;
}
public Triangulo() {
}
public double getBase() {
return base;
}
public void setBase(double base) {
this.base = base;
}
public double getAltura() {
return altura;
}
public void setAltura(double altura) {
this.altura = altura;
}
@Override
public double CalcularArea(){
return ((base*altura)/2);
}
}