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:
Introduccin
TRABAJO
EN para
EL AREA
DISEO
DE SISTEMAS
Los
patrones deREALIZADO
diseo son la base
la bsqueda
de soluciones
a problemas
comunes en el desarrollo de software y otros mbitos referentes al diseo de
interaccin o interfaces.
Un patrn de diseo resulta ser una solucin a un problema de diseo. Para que
una solucin sea considerada un patrn debe poseer ciertas caractersticas. Una de
PIURA - 2015
ellas es que debe haber comprobado su efectividad resolviendo problemas
similares en ocasiones anteriores. Otra es que debe ser reutilizable, lo que
significa que es aplicable a diferentes problemas de diseo en distintas
circunstancias.
Patrones de diseo
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 mecanismos 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.
A continuacin se presenta el cdigo fuente del ejemplo realizado en clase:
Archivo.java
public interface Archivo {
public void crear();
}
ArchivoTxt.java
public class ArchivoTxt implements Archivo{
public void crear(){
System.out.println("Creando archivo de texto plano");
}
}
ArchivoXml.java
public class ArchivoXml implements Archivo{
public void crear(){
System.out.println("Creando archivo XML");
}
}
CreadorArchivo.java
public class CreadorArchivo {
public static Archivo crearArchivo(String descriptor) throws Exception{
if ("ArchivoXml".equals(descriptor)) {
return new ArchivoXml();
} else if ("ArchivoTxt".equals(descriptor))
{
return new ArchivoTxt();
}
else{
throw new Exception("Tipo de archivo no encontrado");
}
}
}
Principal.java
public class Principal {
public static void main(String[] args) {
try {
ArchivoTxt archivoTxt = (ArchivoTxt)
CreadorArchivo.crearArchivo("ArchivoTxt");
archivoTxt.crear();
ArchivoXml archivoXml = (ArchivoXml)
CreadorArchivo.crearArchivo("ArchivoXml");
archivoXml.crear();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
A continuacin algunos ejemplos de este patrn
Ejemplo1
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()
{
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) {
@Override
public double Calcular() {
double mult1;
System.out.println("ingrese el primer numero");
double a= t.nextDouble();
System.out.println("ingrese el segundo numero");
double b=t.nextDouble();
mult1=a*b;
return mult1;
}
}
Resta.java
import java.util.Scanner;
public class Resta implements Operaciones {
Scanner t=new Scanner(System.in);
@Override
public double Calcular() {
double resta;
System.out.println("ingrese el primer numero");
double a= t.nextDouble();
System.out.println("ingrese el segundo numero");
double b=t.nextDouble();
if (a>b){
resta=a-b;}
else resta=b-a;
return resta;
}
}
Suma.java
import java.util.Scanner;
public class Suma implements Operaciones{
Scanner t=new Scanner(System.in);
@Override
public double Calcular() {
double suma;
System.out.println("Que numeros desea sumar");
System.out.print("ingrese el primer numero : ");
double a= t.nextDouble();
System.out.print("ingrese el segundo numero : ");
double b=t.nextDouble();
suma=a+b;
System.out.print("la suma es : ");
return suma;
}
}
Calcular.java
import java.util.Scanner;
Abstract Factory :
Permite trabajar con objetos de distintas familias de manera que las familias no
se mezclen entre s y haciendo transparente el tipo de familia concreta que se
est usando. El problema a solucionar por este patrn es el de crear diferentes
familias de objetos, como por ejemplo la creacin de interfaces grficas de
distintos tipos (ventana, men, botn, etc).
A continucion se muestra el cdigo fuente del ejemplo hecho en clase
Archivo.java
public interface Archivo {
public void crear();
}
ArchivoTxt.java
public class ArchivoTxt implements Archivo{
public void crear(){
System.out.println("Creando archivo de texto plano");
}
}
ArchivoXml.java
public class ArchivoXml implements Archivo{
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) {
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() {
Servicio_ Puerta
+asignarTrabajo()
+indicarFechaEntrega()
+informarSobrePago()
@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() {
System.out.println("Ellos han determinado ir el dia 14/02/15 ha realizar el
trabajo el trabajo.");
}
@Override
public void informarSobrePago() {
System.out.println("Debe realizar el pago en efectivo al momento de
terminar la instalacion de su puerta.");
}
ServicioCarpinteria.java
public interface ServicioCarpinteria {
public void asignarTrabajo();
public void indicarFechaEntrega();
public void informarSobrePago();
}
Principal.java
import java.util.Scanner;
public class Principal {
private static Scanner S = new Scanner(System.in);
public static void main(String[] args) {
int o;
do{
o = preguntarServicio();
switch(o) {
case 1:
usarServicio(new SerPuFactory());
break;
case 2:
usarServicio(new MueblesFactory());
break;
case 3:
usarServicio(new EscritFactory());
break;
case 4:
System.out.println("Cerrando programa.");
break;
default:
System.out.println("Se ha ingresado una opcin invlida.");
}
System.out.print("\n");
}while(o!=4);
}
public static void usarServicio(ServicioFactory factory) {
ServicioCarpinteria servicio = factory.crearServicio();
servicio.asignarTrabajo();
servicio.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
+Producto()
+Producto(descripcion: String, precio: double, stock: double)
+getDescripcion(): String
+getPrecio(): double
+getStock(): double
+setDescripcion(descripcion: String)
+setPrecio(precio: double)
+setStock(stock: double)
+Clone()
Lo que hace es
valor
entre
Cdigo fuente
Producto.java
import java.io.Serializable;
return stock;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public void setPrecio(double precio) {
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
Guerrero
Hechicero
+Guerrero()
+atacar()
+detener()
+clonar(): Enemigo
+Hechicero()
+atacar()
+detener()
+clonar(): Enemigo
GestorEnemigo.java
import java.util.Hashtable;
public class GestorEnemigo{
private Hashtable hEnemigos = new Hashtable();
public GestorEnemigo() {
Enemigo h1 = new Hechicero();
h1.setNombre("Sorcerer1");
this.addEnemigo( h1.getNombre(), h1 );
Enemigo g1 = new Guerrero();
g1.setNombre("Warrior1");
g1.setArma("ESPADA");
this.addEnemigo( g1.getNombre(), g1 );
}
public void addEnemigo( String nombre, Enemigo objEnemigo ) {
this.hEnemigos.put( nombre, objEnemigo );
}
public Enemigo getEnemigo( String nombre ) {
Enemigo objPrototipo = (Guerrero) hEnemigos.get( nombre );
return objPrototipo;
}
public Enemigo getClon( String nombre ) {
Enemigo objPrototipo = (Guerrero) hEnemigos.get( nombre );
return (Enemigo) objPrototipo.clonar();
}
}
Enemigo.java
public abstract class Enemigo
{
private String nombre ="";
private String arma = "DAGA";
public String getNombre() {
return this.nombre;
fuente
}
public void setNombre( String nombre) {
this.nombre = nombre;
}
public String getArma() {
return this.arma;
}
public void setArma( String arma) {
this.arma = arma;
}
public abstract Enemigo clonar();
public abstract void atacar();
public abstract void detener();
}
Guerrero.java
public class Guerrero extends Enemigo
{
public Guerrero() {
System.out.println("Guerrero creado");
}
@Override
public void atacar() {
System.out.println("El guerrero ataca");
}
@Override
public void detener() {
System.out.println("El guerrero se detiene");
}
@Override
public Enemigo clonar()
{
Guerrero objGuerrero = new Guerrero();
objGuerrero.setNombre( this.getNombre() );
objGuerrero.setArma( this.getArma() );
return objGuerrero;
}
}
Hechicero.java
public class Hechicero extends Enemigo
{
public Hechicero() {
System.out.println("Hechicero creado");
}
@Override
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 {
public DocumentacionCliente(String informacion) {
documentos = new ArrayList<Documento>();
DocumentacionEnBlanco documentacionEnBlanco =
DocumentacionEnBlanco.Instance();
List<Documento> documentosEnBlanco =
documentacionEnBlanco.getDocumentos();
for (Documento documento: documentosEnBlanco){
Documento copiaDocumento = documento.duplica();
copiaDocumento.rellena(informacion);
documentos.add(copiaDocumento);
}
}
public void visualiza(){
for (Documento documento: documentos)documento.visualiza();
}
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;
public int numero;
private Clase(){
}
public static Clase getInstancia(){
if (instancia==null) {
instancia=new Clase();
}
return instancia;
}
public int getNumero(){
return numero;
}
public void setNumero(int numero){
this.numero=numero;
-instance
}
}
Principal.java
public class Principal {
public static void main(String[] args) {
Clase Objeto=Clase.getInstancia();
Clase Objeto1=Clase.getInstancia();
Clase Objeto2=Clase.getInstancia();
Objeto.setNumero(3);
System.out.println(Objeto.numero);
System.out.println(Objeto1.numero);
System.out.println(Objeto2.numero);
}
}
A continuacin unos ejemplos de este patrn
Ejemplo1
Instancia
+cantidad: int
-jf: J Frame
+llm: int
+getInstancia(): J Frame -instance
+vecesLlamado()
+Instance(): Instancia
Cdigo fuente
Instancia.java
import javax.swing.JFrame;
public class Instancia {
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE,
javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
);
pack();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JPanel jPanel1;
// End of variables declaration
}
Frm_Principal.java
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Frm_Principal extends javax.swing.JFrame {
public Frm_Principal() {
initComponents();
this.setTitle("Ventana Principal");
this.setLocationRelativeTo(null);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenuItem2 = new javax.swing.JMenuItem();
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 {
//</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) {
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>
app.controlador:
ControladorProducto.java
import app.dao.ProductoDao;
import app.entidad.Producto;
import app.servicio.ProductoServicio;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = {"/ControladorProducto"})
public class ControladorProducto extends HttpServlet {
protected void processRequest(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String operacion = request.getParameter("operacion");// significa
que aparecera despues del ?
ProductoServicio servicio = new ProductoServicio();
if (operacion.equals("Listar")) {
try {
ArrayList<Producto> productos = servicio.listarProductos();
request.setAttribute("productos", productos);
} catch (Exception e) {
request.setAttribute("error", e.getMessage());
}
RequestDispatcher rd =
request.getRequestDispatcher("vistaListarProductos.jsp");
rd.forward(request, response);
}
if (operacion.equals("FormRegistrar")) {
response.sendRedirect("formRegistrarProducto.jsp");//archivo al
cual se direcciona al presionar esa direccion
}
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;
public class ProductoDao {
private Producto producto;
public ProductoDao(){
}
public ProductoDao(Producto p){
this.producto=p;
}
public void registrar() throws Exception{
BaseDatos.conectar();
String sql="INSERT INTO Producto
(descripcion,precio,stock,estado) ";
sql+="VALUES('"+producto.getDescripcion()+"',";
sql+=producto.getPrecio()+","+producto.getStock()+",1)";
BaseDatos.ejecutar(sql);
BaseDatos.desconectar();
}
public void eliminar() throws Exception{
}
public void modificar() throws Exception {
}
public void buscarPorID(int id) throws Exception {
}
public ArrayList listar() throws Exception {
BaseDatos.conectar();
String sql="SELECT * FROM Producto WHERE estado=1 ";
ResultSet rs = BaseDatos.consultar(sql);
ArrayList<Producto> productos = new ArrayList<Producto>();
while(rs.next()){
Producto temp= new Producto(rs.getInt("id"),
rs.getString("descripcion"),
rs.getDouble("precio"),
rs.getDouble("stock"));
productos.add(temp);
}
BaseDatos.desconectar();
return productos;
}
public Producto getProducto() {
return producto;
}
public void setProducto(Producto producto) {
this.producto = producto;
}
}
app.entidad:
Producto.java
public class Producto {
private int id;
private String descripcion;
private Double precio;
private Double stock;
private boolean estado;
public Producto(){
}
public Producto(String descripcion, Double precio, Double stock){
this.id=id;
this.descripcion=descripcion;
this.precio=precio;
this.stock=stock;
this.estado=true;
}
public Producto(int id,String descripcion, Double precio, Double
stock){
this.id=id;
this.descripcion=descripcion;
this.precio=precio;
this.stock=stock;
this.estado=true;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public Double getPrecio() {
return precio;
}
public void setPrecio(Double precio) {
this.precio = precio;
}
public Double getStock() {
return stock;
}
public void setStock(Double stock) {
this.stock = stock;
}
public boolean isEstado() {
return estado;
}
public void setEstado(boolean estado) {
this.estado = estado;
}
}
app.servicio
ProductoServicio.java
import app.dao.ProductoDao;
import app.entidad.Producto;
import java.util.ArrayList;
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);
}
//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);
Cdigo
fuente
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;
}
public int get_total(){
return this.total;
}
}
Vista.java
public final class vista extends javax.swing.JFrame {
/** Creates new form vista */
public vista() {
initComponents();
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
vtxt3 = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
vtxt1 = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
vtxt2 = new javax.swing.JTextField();
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenu2 = new javax.swing.JMenu();
cmdsumar = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
getContentPane().setLayout(new java.awt.GridBagLayout());
vtxt3.setFont(new java.awt.Font("Tahoma", 1, 24)); // NOI18N
vtxt3.setText("0");
vtxt3.setPreferredSize(new java.awt.Dimension(60, 40));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(20, 0, 20, 10);
getContentPane().add(vtxt3, gridBagConstraints);
jLabel2.setFont(new java.awt.Font("Tahoma", 1, 36)); // NOI18N
jLabel2.setText("=");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 0;
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) {
//nuevas instancias de clase
modelo modelo = new modelo();
vista vista = new vista();
controlador controlador = new controlador( vista , modelo );
//se inicia la vista
controlador.iniciar_vista();
vista.setVisible(true);
}
}
Al ejecutar el programa obtenemos
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 {
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
*/
public String getNombrePersona() {
return nombrePersona;
}
/**
* @param nombrePersona the nombrePersona to set
*/
public void setNombrePersona(String nombrePersona) {
this.nombrePersona = nombrePersona;
}
/**
* @return the edadPersona
*/
public Integer getEdadPersona() {
return edadPersona;
}
/**
* @param edadPersona the edadPersona to set
*/
public void setEdadPersona(Integer edadPersona) {
this.edadPersona = edadPersona;
}
/**
* @return the profesionPersona
*/
public String getProfesionPersona() {
return profesionPersona;
}
/**
* @param profesionPersona the profesionPersona to set
*/
public void setProfesionPersona(String profesionPersona) {
this.profesionPersona = profesionPersona;
}
/**
* @return the telefonoPersona
*/
public Integer getTelefonoPersona() {
return telefonoPersona;
}
/**
* @param telefonoPersona the telefonoPersona to set
*/
public void setTelefonoPersona(Integer telefonoPersona) {
this.telefonoPersona = telefonoPersona;
}
}
VentanaBuscar.java
import javax.swing.JTextField;
import modelo.Logica;
import modelo.vo.PersonaVo;
import controlador.Coordinador;
public class VentanaBuscar extends JFrame implements ActionListener {
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();
}
}
}
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);
}
miLogica.setCoordinador(miCoordinador);
/*Se establecen relaciones con la clase coordinador*/
miCoordinador.setMiVentanaPrincipal(miVentanaPrincipal);
miCoordinador.setMiVentanaRegistro(miVentanaRegistro);
miCoordinador.setMiVentanaBuscar(miVentanaBuscar);
miCoordinador.setMiLogica(miLogica);
miVentanaPrincipal.setVisible(true);
}
}
Al ejecuatar el cdigo obtenemos
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>();
}
public void agregar(Fichero f){
ficheros.add(f);
}
<<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);
}
}