Sunteți pe pagina 1din 103

"Ao de la Diversificacin Productiva y del Fortalecimiento

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

CALLE GARCIA, Jairo Daro


MARCELO MAZA, Marcos Pal
VEGA CAMPOS, Jorge Junior

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:

Un nombre de patrn que representa el problema y su solucin en trminos de


una o dos palabras.

El problema describir cuando aplicar el patrn. Explica el problema y su


contexto.

La solucin describe los elementos que participan en el diseo, sus relaciones,


responsabilidades y colaboraciones.

Las consecuencias explican los resultados de aplicar el patrn, sus costes y


beneficios. A travs de ellas se podr evaluar cmo se adecua el patrn a nuestro
problema frente a otras alternativas.

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:

Proporcionar catlogos de elementos reusables en el diseo de sistemas


software.

Evitar la reiteracin en la bsqueda de soluciones a problemas ya conocidos y


solucionados anteriormente.

Formalizar un vocabulario comn entre diseadores.

Estandarizar el modo en que se realiza el diseo.

Facilitar el aprendizaje de las nuevas generaciones de diseadores condensando


conocimiento ya existente.

Asimismo, no pretenden:

Imponer ciertas alternativas de diseo frente a otras.

Eliminar la creatividad inherente al proceso de diseo.

No es obligatorio utilizar los patrones, solo es aconsejable en el caso de tener el mismo


problema o similar que soluciona el patrn, siempre teniendo en cuenta que en un caso
particular puede no ser aplicable. "Abusar o forzar el uso de los patrones puede ser un
error".

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

+crearPedido(importe: double): Pedido

+crearPedido(importe: double): Pedido

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

+operar(opcion: double): 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;
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;

public class Calcular {


public static void main(String[] args) {
Scanner t= new Scanner(System.in);
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 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{

public void crear(){


System.out.println("Creando archivo XML");
}
}
CreadorArchivo.java
public abstract class CreadorArchivo {
public abstract Archivo crearArchivo();
}
CreadorArchivoTxt.java
public class CreadorArchivoTxt extends CreadorArchivo{
public Archivo crearArchivo(){
return new ArchivoTxt();
}
}
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() {

Servicio_ Puerta
+asignarTrabajo()
+indicarFechaEntrega()
+informarSobrePago()

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_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() {
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;

hacer una copia con


objetos de una clase.
de ejmplo en clase:

public class Producto implements Cloneable {


private String descripcion;
private double precio;
private double stock;
@Override
public Producto clone() throws CloneNotSupportedException {
return (Producto) super.clone();//copia por valor dentro de los objetos en
una misma clase
}
public Producto() {
}
public Producto(String descripcion, double precio, double stock) {
this.descripcion = descripcion;
this.precio = precio;
this.stock = stock;
}
public String getDescripcion() {
return descripcion;
}
public double getPrecio() {
return precio;
}
public double getStock() {

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

-nombre = "": String


-arma = "DAGA": String
+getNombre(): String
+setNombre(nombre String)
+getArma(): String
+setArma(arma: String)
+clonar(): Enemigo
+atacar(): abstract
+detener(): abstract
+Operation1()

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

public void atacar() {


System.out.println("El hechicero ataca");
}
@Override
public void detener() {
System.out.println("El hechiero se detiene");
}
@Override
public Enemigo clonar()
{
Hechicero objHechicero = new Hechicero();
objHechicero.setNombre( this.getNombre() );
objHechicero.setArma( this.getArma() );
return objHechicero;
}
}
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)
System.out.println("Tras modificar el original, ahora es [" + g1.getNombre()
+ "]");
System.out.println("Su arma es [" + g1.getArma() + "]\n");
System.out.println("El nombre del clon es [" + g2.getNombre() + "]");
System.out.println("Su arma es [" + g2.getArma() + "]");
}
}
Resultado del cdigo

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();
}

public void imprime(){


for (Documento documento: documentos)documento.imprime();
}
}
DocumentacionEnBlanco.java
import java.util.*;
public class DocumentacionEnBlanco extends Documentacion{
private static DocumentacionEnBlanco _instance = null;
private DocumentacionEnBlanco(){
documentos = new ArrayList<Documento>();
}
public static DocumentacionEnBlanco Instance(){
if (_instance == null)_instance = new DocumentacionEnBlanco();
return _instance;
}
public void incluye(Documento doc){
documentos.add(doc);
}
public void excluye(Documento doc){
documentos.remove(doc);
}
}
Documento.java
public abstract class Documento implements Cloneable {
protected String contenido = new String();
public Documento duplica() {
Documento resultado;
try{
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;
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

ejemplo nos permite


instancia en el diseo,
objeto para todas las

}
}
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 {

private static JFrame jf;


public static int cantidad=0,llm;
private Instancia() {
}
public static JFrame getInstacia(){
if(jf==null){
jf= new Login();
llm++;
}
return jf;
}
public static void vecesLlamado(){
System.out.println("Se ha llamado el metodo: "+(cantidad=cantidad+llm)
+" veces");
}
}
Login.java

public class Login extends javax.swing.JFrame {


public Login() {
initComponents();
this.setTitle("Ventana Login");
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WIDTH);
this.setResizable(false);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOS
E);
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, 400, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEAD
ING)
.addGap(0, 128, Short.MAX_VALUE)
);
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>
// 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 {

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

Model View Controller (MVC) :


Es un patrn de arquitectura de software que separa los datos y la lgica de
negocio de una aplicacin de la interfaz de usuario y el mdulo encargado de
gestionar los eventos y las comunicaciones. Este patrn plantea la separacin del
problema en tres capas: la capa model, que representa la realidad; la
capa controller , que conoce los mtodos y atributos del modelo, recibe y realiza
lo que el usuario quiere hacer; y la capa vista, que muestra un aspecto del
modelo y es utilizada por la capa anterior para interaccionar con el usuario.
En clase observamos el siguiente ejemplo:

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;

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);
}
//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 {

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
*/
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 {

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();
/*Se establecen las relaciones entre clases*/
miVentanaPrincipal.setCoordinador(miCoordinador);
miVentanaRegistro.setCoordinador(miCoordinador);
miVentanaBuscar.setCoordinador(miCoordinador);

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);
}

public double calcularEspacio(){


double suma=0;
for(int i=0;i<ficheros.size();i++){
suma+=ficheros.get(i).calcularEspacio();
}
return suma;
//
for (Fichero f: ficheros) {
//
suma+=ficheros.
//
}
}
}
Fichero.java
public interface Fichero {
public double calcularEspacio();
}
Principal.java
public class Principal {
public static void main(String[] args) {
Archivo a1 = new Archivo("a1.txt", 10);
Archivo a2 = new Archivo("a1.txt", 20);
Archivo a3 = new Archivo("a1.txt", 30);
Archivo a4 = new Archivo("a1.txt", 40);
Archivo a5 = new Archivo("a1.txt", 50);
Carpeta c1 = new Carpeta();
c1.agregar(a1);
c1.agregar(a2);
Carpeta c2 = new Carpeta();
c2.agregar(a3);
c2.agregar(a4);
c2.agregar(c1);
Carpeta c3 = new Carpeta();
c3.agregar(c1);
c3.agregar(c2);
System.out.println("Carpeta 1:" + c1.calcularEspacio());
System.out.println("Carpeta 2:" + c2.calcularEspacio());
System.out.println("Carpeta 3:" + c3.calcularEspacio());
}
}
A continuacin mostraremos dos ejemplos de este patrn:
Ejemplo1

<<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;
}

public void imprimir() {


System.out.println("-------------");
System.out.println("Nombre ="+getNombre());
System.out.println("Salario ="+getSalario());
System.out.println("-------------");
Iterator<Empleado> employeeIterator = empleado.iterator();
while(employeeIterator.hasNext()){
Empleado employee = employeeIterator.next();
employee.imprimir();
}
}
// public void remove(Empleado empleados) {
//
empleado.remove(empleados);
// }
}
Revelador.java
public class Revelador implements Empleado{
private String nombre;
private double salario;
public Revelador(String nombre,double salario){
this.nombre = nombre;
this.salario = salario;
}
public void add(Empleado empleado) {
//this is leaf node so this method is not applicable to this class.
}
public Empleado getChild(int i) {
//this is leaf node so this method is not applicable to this class.
return null;
}
public String getNombre() {
return nombre;
}
public double getSalario() {
return salario;
}
public void imprimir() {
System.out.println("-------------");
System.out.println("Nombre ="+getNombre());
System.out.println("Salario ="+getSalario());
System.out.println("-------------");
}

// public void remove(Empleado empleado) {


// //this is leaf node so this method is not applicable to this class.
// }
}
Main.java
public class Main {
public static void main(String[] args) {
Empleado emp1=new Revelador("John", 10000);
Empleado emp2=new Revelador("David", 15000);
Empleado manager1=new Gerente("Daniel",25000);
manager1.add(emp1);
manager1.add(emp2);
Empleado emp3=new Revelador("Michael", 20000);
Gerente generalManager=new Gerente("Mark", 50000);
generalManager.add(emp3);
generalManager.add(manager1);
generalManager.imprimir();
}
}
Resultado de cdigo:

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()

public class Ventana implements IVentana


{
public Ventana() {
}
@Override
public void dibujar(int col, int fila)
{
System.out.println("Dibujada ventana bsica en [" + col + "], [" + fila
+ "]" );
}

}
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()
{

System.out.println("Agregada barra de desplazamiento horizontal");


}
}
DecoradorDesplazamientoVert.java
public class DecoradorDesplazamientoVert extends DecoradorDesplazamiento
{
public DecoradorDesplazamientoVert( 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.dibujarBarraDespVertical();
}
private void dibujarBarraDespVertical()
{
System.out.println("Agregada barra de desplazamiento vertical");
}
}
Main.java
public class Main
{
public static void main(String[] args)
{
IVentana ventana1 = new Ventana();
ventana1.dibujar(50, 70);
System.out.println("-----");
// Dibujar una ventan que tenga la barra de desplazamiento vertical
IVentana ventana2 = new DecoradorDesplazamientoVert( new Ventana() );
ventana2.dibujar(300, 200);
System.out.println("-----");
// Dibujar una ventan que tenga la barra de desplazamiento horizontal
IVentana ventana3 = new DecoradorDesplazamientoHoriz( new
Ventana() );
ventana3.dibujar(400, 300);
System.out.println("-----");
// Dibujar una ventana que tenga las barras de desplazamientos horizontal y
vertical
IVentana ventana4 = new DecoradorDesplazamientoVert( new

DecoradorDesplazamientoHoriz( new Ventana() ) );


ventana4.dibujar(100, 120);
}
}
Resultado del cdigo

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

this.asiento = new ComprobarAsiento();


this.espejos = new ComprobarEspejos();
this.arrancar = new Arrancar();
}
// -------------------------------public void arrancarCoche()
{
liquidos.comprobar();
asiento.comprobar();
espejos.comprobar();
arrancar.encenderContacto();
}
}
Arrancar.java
Public class Arrancar {
public Arrancar() {
}
// -----------------public void encenderContacto() {
System.out.println("Introducimos la llave y le damos al encendido...");
}
}
ComprobarAsiento.java
public class ComprobarAsiento
{
public ComprobarAsiento() {
}
public void comprobar() {
System.out.println("Comprobamos y regulamos el asiento...");
}
}
ComprobarEspejos.java
Public class ComprobarEspejos {
public ComprobarEspejos() {
}
public void comprobar() {
System.out.println("Comprobamos y regulamos los espejos retrovisores...");
}
}
ComprobarLiquidos.java
Public class ComprobarLiquidos {
public ComprobarLiquidos() {
}
public void comprobar() {
System.out.println("Comprobamos los lquidos de freno, agua, etc...");
}
}
Principal1.java

public class Principal1 {


public static void main(String[] args)
{
Facade fachada = new Facade();
fachada.arrancarCoche();
System.out.println("\nProceso finalizado.");
}
}
Al ejecutar el cdigo obtenemos

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

public String getNombre() {


return nombre;
}
public void setNombre(String n) {
this.nombre = n;
}
public void update(String existencia) {
System.out.println("Hola "+nombre+", "+existencia+" este
producto en stock");
}
}
Producto.java
import java.util.ArrayList;
public class Producto implements Sujeto{
private ArrayList<Observador> observadores = new
ArrayList<Observador>();
private String nombre;
private String tipo;

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 {

public static void main(String[] args) {


Persona juan=new Persona("Juan");
Persona marta=new Persona("Marta");
Producto galleta=new Producto("Oreo", "Galleta", "No hay");
galleta.registerObserver(juan);
galleta.registerObserver(marta);
galleta.setExistencia("S hay");
}
}
A continuacin los siguientes ejemplos de este patrn :
Ejemplo1
ObservadorDeConsola
+observable: I Observable
+update()

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.
*

* @param observer objeto IObserver del ArraList "observers" que se desea


* eliminar.
*/
@Override
public void removeObserver(IObserver observer) {
observers.remove(observer);
}
/**
* Setter de la hora.
*
* @param hora int hora a almacenar.
*/
public void setHora(int hora) {
this.hora = hora;
}
/**
* Setter de los minutos.
*
* @param minutos int minutos a almacenar.
*/
public void setMinutos(int minutos) {
this.minutos = minutos;
}
/**
* Setter de los segundos.
*
* @param segundos int segundos a almacenar.
*/
public void setSegundos(int segundos) {
this.segundos = segundos;
}
/**
* Getter de la hora.
*
* @return int hora.
*/
public int getHora() {
return hora;
}
/**
* Getter de los minutos.
*
* @return int minutos.
*/
public int getMinutos() {

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();
}
/**

* Metodo que, manteniendo el objeto sincronizado, desarrolla un bucle


* infinito que analiza los valores del estado del objeto y los modifica
* cada segundo comprobando si se deben incrementar los minutos y horas.
*/
@Override
public void run() {
synchronized (this) {
while (true) {
try {
//Esperamos un segundo.
this.wait(1000);
//Si el valor de segundos llega a 60.
if (getSegundos() + 1 == 60) {
//Ponemos los segundos a 0.
setSegundos(0);
//Si el valor de minutos llega a 60.
if (getMinutos() + 1 == 60) {
//Ponemos los minutos a 0.
setMinutos(0);
//Si el valor de las horas llega a 24.
if (getHora() + 1 == 24) {
//Ponemos el valor de las horas a 0.
setHora(0);
} else {
//Si no incrementamos la hora en una unidad.
setHora(getHora() + 1);
}
} else {
//Si no incrementamos los minutos en una unidad.
setMinutos(getMinutos() + 1);
}
} else {
//Si no incrementamos los segundos en una unidad.
setSegundos(getSegundos() + 1);
}
//Notificamos a los observadores que se ha producido un cambio
//en los valores del estado del objeto.
notificar();
} catch (InterruptedException ex) {
//En caso de que se produzca alguna interrupcion del hilo
//capturamos la excepcion y mostramos un mensaje.
Logger.getLogger(Tiempo.class.getName()).log(Level.SEVERE,
"Se produjo una excepcin en la ejecucin.", ex);
}
}
}
}
}
IObserver.java
public interface IObserver {

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);

lblHora.setMaximumSize(new java.awt.Dimension(300, 100));


lblHora.setPreferredSize(new java.awt.Dimension(300, 100));
lblHora.setVerifyInputWhenFocusTarget(false);
panelContenedor.add(lblHora);
getContentPane().add(panelContenedor, java.awt.BorderLayout.CENTER);
pack();
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JLabel lblHora;
private javax.swing.JPanel panelContenedor;
// End of variables declaration
/**
* Metodo de la interfaz IObserver implementado que actualizara el texto del
JLabel.
*/
@Override
public void update() {
lblHora.setText(observable.toString());
pack();
}
}
ObserverPrincipal.java
public class ObserverPrincipal {
public static void main(String[] args) {
Tiempo tiempo = new Tiempo(23, 59, 50);
ObservadorDeConsola oConsola = new ObservadorDeConsola(tiempo);
ObservadorGrafico oGrafico = new ObservadorGrafico(tiempo);
oGrafico.setVisible(true);
tiempo.start();
}
}
Al ejecutar el cdigo obtenemos

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

que le conviene e intercambiarlo dinmicamente segn sus necesidades.


En clase observamos un ejemplo de este patrn de comportamiento el cual se
muestra en el siguiente diagrama de clase.
Persona
+dni: String
+apellidos: String
+nombres: String
-rol: Rol
+Persona(dni: String, apellidos: String, nombres: String)
+getDni(): String
+getApellidos(): String
+getNombres(): String
+getRol(): Rol
+setDni(String dni)
+setApellidos(String apellidos)
+setNombres(String nombres)
+setRol(rol: Rol)
+negociar()

<<Interface>>
Rol
+negociar()

Vendedor
+Vendedor()
+negociar()

Comprador
+Comprador()
+negociar()

A la persona se le asigna un rol, es decir se crea un objeto a la clase Persona,


donde irn los setRol, getRol, ya que estos mtodos le dirn cmo se comporta.
Ahora veremos el cdigo utilizado en el ejemplo realizado en clase:
Persona.java
public class Persona {
private String dni;
private String apellidos;
private String nombres;
private Rol rol;
public Persona(){
}
public Persona(String dni, String apellidos, String nombres){
this.dni=dni;
this.apellidos=apellidos;
this.nombres=nombres;
}
public String getDni() {
return dni;
}
public String getApellidos() {
return apellidos;
}
public String getNombres() {
return nombres;
}

public Rol getRol(){


return rol;
}
public void setDni(String dni) {
this.dni = dni;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public void setNombres(String nombres) {
this.nombres = nombres;
}
public void setRol(Rol rol){
this.rol=rol;
}
public void negociar(){
rol.negociar();
}
}
Rol.java
public interface Rol {
public void negociar();
}
Vendedor.java
public class Vendedor implements Rol{
public Vendedor(){
}
public void negociar(){
System.out.println("Negocia como vendedor");
}
}
Comprador.java
public class Comprador implements Rol {
public Comprador(){
}
public void negociar(){
System.out.println("Negocia como comprador");
}
}
Principal.java
public class Principal {
public static void main(String[] args) {
Persona juan = new Persona("72727272","Prez","Juan");
juan.setRol(new Comprador());
juan.negociar();
juan.setRol(new Vendedor());

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);
}
}

S-ar putea să vă placă și