Documentos de Académico
Documentos de Profesional
Documentos de Cultura
FACULTAD DE INGENIERÍA
PATRONES DE DISEÑO
DE SOFTWARE
Abril 2019
2
Acerca del autor
3
Requisitos previos
Este manual está pensado para estudiantes de la carrera de ingeniería de sistemas
e informática y afines programadores junior que se inician en la carrera como
programadores de software o para programadores senior que desean aplicar
conocimientos de patrones de diseño.
4
5
Contenido
Sesión 1.......................................................................................................... 8
Categorías de patrones.............................................................................. 11
Sesión 2........................................................................................................ 14
Objetos ..................................................................................................... 14
Atributos .................................................................................................. 14
Mensajes. ................................................................................................. 15
Encapsulamiento ...................................................................................... 24
Ejercicios ..................................................................................................... 26
6
El Patrón Abstract Factory ( ......................................................................... 29
Problema .................................................................................................. 29
Discusión ................................................................................................. 29
SOLUCIÓN ......................................................................................... 31
2.-Participantes. .................................................................................... 32
Dominios de uso....................................................................................... 33
Ejercicio propuesto....................................................................................... 39
7
Sesión 1
Un poco de historia
Por los años 1994, se publica el libro "Design Patterns: Elements of Reusable
Object Oriented Sofware" escrito por los 4 amigos Gang of Four (GoF), que en
español es la pandilla de los cuatro, formada por Erich Gamma, Richard Helm,
8
Ralph Johnson y John Vlissides. Ellos recopilaron y documentaron 23 patrones
de diseño aplicados usualmente por expertos diseñadores de software orientado
a objetos.
9
De manera similar, si Ud. construye un sistema, debe saber por dónde empezar,
qué características debe tener dicho sistema, cómo interactúa con su entorno.
Y si dicho sistema necesita software, pues
debe saber qué se espera de dicho
software, como es su comportamiento,
cómo son sus interfaces, qué problemas
soluciona dicho software, y como se
adapta a nuevos componentes, etc.
Los patrones de diseño han sido optimizados, son soluciones reutilizables a los
problemas de programación. Un patrón de diseño no es una clase o una
biblioteca que, simplemente, puede conectarse a nuestro sistema, es mucho más
que eso.
Algunos autores mencionan que, cualquier patrón de diseño puede ser un arma
de doble filo, si se aplican en el lugar equivocado, puede ser desastroso y crear
muchos problemas mayores. Sin embargo, si se implementa en el lugar correcto
y en el momento adecuado, puede ser de gran ayuda.
De manera que para que una solución sea considerada un patrón debe poseer
ciertas características. Una de ellas es que debe haber comprobado su
10
efectividad resolviendo problemas similares en ocasiones anteriores. Otra es
que debe ser reutilizable, lo que significa que es aplicable a diferentes
problemas de diseño en distintas circunstancias.
Asimismo, no pretenden:
Categorías de patrones
11
Patrones de diseño: Aquellos que expresan esquemas para definir
estructuras de diseño (o sus relaciones) con las que construir sistemas de
software.
Nombre del patrón: nombre estándar del patrón por el cual será
reconocido en la comunidad (normalmente se expresan en inglés).
12
Clasificación del patrón: creacional, estructural o de comportamiento.
Intención: ¿Qué problema pretende resolver el patrón? También
conocido como: Otros nombres de uso común para el patrón.
Motivación: Escenario de ejemplo para la aplicación del patrón.
Aplicabilidad: Usos comunes y criterios de aplicabilidad del patrón.
Estructura: Diagramas de clases oportunos para describir las clases que
intervienen en el patrón.
Participantes: Enumeración y descripción de las entidades abstractas (y
sus roles) que participan en el patrón.
Colaboraciones: Explicación de las interrelaciones que se dan entre los
participantes.
Consecuencias: Consecuencias positivas y negativas en el diseño
derivadas de la aplicación del patrón.
Implementación: Técnicas o comentarios oportunos de cara a la
implementación del patrón.
Código de ejemplo: Código fuente ejemplo de implementación del
patrón.
Usos conocidos: Ejemplos de sistemas reales que usan el patrón.
Patrones relacionados: Referencias cruzadas con otros patrones.
Fuentes:
https://ittgweb.wordpress.com/2016/05/29/3-2-patrones-de-diseno/
http://www.ciberaula.com/articulo/diseno_patrones_j2ee
13
Sesión 2
Los objetos pueden ser tan simples como por ejemplo una mesa, o tan compleja
como un motor. De manera que los objetos pueden ser reales, tangibles como
intangibles o hasta imaginarios, por ejemplo, el objeto “sentimientos” que solo
podemos caracterizar o definirlo por sus atributos tipo de sentimiento.
Atributos
Para nosotros serán representación de los valores o características de los
objetos, los cuales nos permite definir sus cualidades inclusive hasta su estado
(término que veremos más adelante).
14
Podemos definir que existen Características Variables, como:
Modelo
Marca
Color
Serie de motor
Velocidad Tope
Capacidad máxima de pasajeros.
Número de llantas.
Mensajes.
Los objetos, para nuestro estudio deben tener la capacidad de comunicarse por
medio de mensajes. Claro está que los mensajes deben tener el dato, o
información necesaria que el otro objeto espera. Si un objeto desea que otro
objeto realice una operación o realice algo, el primero debe enviarle un mensaje
Características de un mensaje.
Objeto destino del mensaje enviado. laMototatxi
Método a ejecutarse. encenderMotor
Parámetros del método. contactoenON
15
Apagar Motor
Acelerar
Frenar
Avanzar hacia adelante
Retroceder (sólo algunas motos).
Girar a la derecha
Girar a la izquierda
Realizar cambios (tipo cambio)
Las Clases
Representan un tipo especial o particular de una colección de objetos, que
pueden tener características similares inclusive comportamiento, pero que no
representa un concepto más general que el de un objeto.
16
Así podríamos tener una clase Mototaxis, o una clase más genérica llamada
clase automóvil o más aún una clase Vehículo. Y cada clase podría tener toda
una variedad de objetos.
Ejemplo:
// atributos:
String modelo;
String marca;
String color;
double velocidad_tope;
String tipo_gasolina;
double velocidad;
double aceleracion;
// métodos:
void encender() {
// instrucciones para encender
};
void partida() {
// instrucciones para la partida del vehículo
};
void frenar() {
// instrucciones para frenar el vehículo
};
17
void acelerar() {
// instrucciones para acelerar el vehículo
};
void girar_derecha(int grados) {
// instrucciones para girar a la derecha
};
// Así se pueden añadir otros métodos
}; // fin definición de la clase vehículo
empleado1:Empleado
NOMBRE apellido=”Zamudio”
nombre=”Danton” ESTADO INTERNO
sexo=”masculino”
sueldo=”2000.00”
calcularSueldo()
INTERFACE calcularAñosServicio()
Todos los objetos con el mismo estado interno, y las mismas interfaces se
agrupan en una sola clase.
18
La representación de los diagramas de clases en UML, es a través de un
rectángulo denominado clasificador. Un clasificador nos indica el nombre de
la clase y un ejemplo de dicha clase será un objeto. Las clases tienen
características que comprenden a los atributos y los comportamientos
(métodos).
19
R1: Relación de Herencia (Generalización / Especialización o Es-
un)
Es un tipo de jerarquía de clases, donde cada subclase contiene los atributos y
métodos de una (herencia simple) o más superclases (herencia múltiple).
} } }
20
R2:Relación de Agregación (Todo / Parte, Forma parte de)
Este tipo de relación representa a los objetos compuestos por otros objetos.
Vehiculo.java Motor.java
package model; package model;
public Motor(){
public Vehiculo(){ super();
super(); }
}
}
}
21
R3:Relación de Composición
Un componente es parte esencial de un elemento. Si el componente es
eliminado o desaparece, la clase mayor deja de existir.
Persona.java Cabeza.java
} }
22
R4: Relación de Asociación («uso», usa, cualquier otra relación)
La relación de asociación se establece cuando dos clases tienen una
dependencia de uso es decir, una clase usa atributos y/o métodos de otra para
funcionar.
Cliente.java Compra.java
23
Encapsulamiento
Los objetos muestran hacia afuera la interface, pero ocultan la implementación
y el estado interno.
24
CASO 3: Se requiere acceder a color, solamente para vehículo.
25
Ejercicios
1.-Diseñe objetos:
2.- Interprete los siguientes diseños, distinga qué tipo de relación corresponde
y codifique en java.
a)
b)
26
c)
a) Cada aula alberga uno o más grupos a los que se imparten una o más
asignaturas, a su vez cada grupo tiene asignada una o más aulas en donde recibe
docencia de una o más asignaturas, y además cada asignatura se imparte en una
o más aulas a uno o más grupos.
27
Del torneo interesa conocer la fecha del torneo, los encuentros celebrados y el
ganador. De cada jugador, que debe de conocer perfectamente las reglas,
interesa saber el número de federado de la federación de la que es miembro.
De cada persona interesa saber sus datos básicos: RUC, nombre completo y
fecha de nacimiento. La clase Fecha se modela con tres campos (día, mes y
año) de tipo entero. La clase RUC se modela con un campo de tipo entero
llamado dni y un campo de tipo carácter llamado letra.
https://slideplayer.es/slide/3965899/
https://styde.net/encapsulamiento-en-la-programacion-orientada-a-objetos/
28
Sesión 3
Problema
Si una aplicación debe ser portátil, esta debe encapsular las dependencias de la
plataforma. Estas "plataformas" pueden ser: sistema de ventanas, sistema
operativo, base de datos, etc. Muy a menudo, esta encapsulación no está
diseñada de antemano, y muchas declaraciones con diversas opciones para
todas las plataformas comienzan a aparecer esparcidos por todo el código
(SourceMaking, 2019).
Discusión
Se desea proporcionar un nivel de direccionamiento indirecto que resuma la
creación de familias de objetos relacionados o dependientes sin especificar
directamente sus clases concretas.
específica del “objeto fábrica” aparece solo una vez en la aplicación, donde se
El objeto Catálogo puede utilizar estas subclases concretas para instanciar los
productos.
30
No obstante si fuera necesario incluir nuevas clases de familias de vehículos
(diésel o mixto gasolina-eléctrico), las modificaciones a realizar en el objeto
Catálogo pueden ser bastante pesadas.
SOLUCIÓN
El patrón Abstract Factory resuelve este problema introduciendo una interfaz
FábricaVehículo que contiene la firma de los métodos para definir cada
producto. El tipo devuelto por estos métodos está constituido por una de las
clases abstractas del producto. De este modo el objeto Catálogo no necesita
conocer las subclases concretas y permanece desacoplado de las familias de
producto. Se incluye una subclase de implementación de FábricaVehículo por
cada familia de producto, a saber las subclases FábricaVehículoElectricidad y
FábricaVehículoGasolina. Dicha subclase implementa las operaciones de
creación del vehículo apropiado para la familia a la que está asociada.
El objeto Catálogo recibe como parámetro una instancia que responde a la
interfaz FábricaVehículo, es decir o bien una instancia de
FábricaVehículoElectricidad, o bien una instancia de
FábricaVehículoGasolina. Con dicha instancia, el catálogo puede crear
y manipular los vehículos sin tener que conocer las familias de vehículos y las
clases concretas de instanciación correspondientes.
31
Estructura del Patrón Fábrica de Abstracciones
1.-Diagrama de clases
2.-Participantes.
Los participantes del patrón son los siguientes:
3.- Colaboraciones
La clase Cliente utiliza una instancia de una de las fábricas concretas para crear
sus productos a partir de la interfaz FábricaAbstracta.
Dominios de uso
El patrón se utiliza en los dominios siguientes:
////////////////////////////////////////////////////
////////////////////////////////////////////////////
33
public Automovil(String modelo, String color, int
potencia, double espacio)
{
this.modelo = modelo;
this.color = color;
this.potencia = potencia;
this.espacio = espacio;
}
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
34
using System;
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
35
Creación de interfaces: Lla interfaz FabricaVehiculo y sus dos clases de
implementación, una para cada familia (eléctrico/gasolina).
Observe que sólo las clases de implementación utilizan las clases concretas
de los vehículos.
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
36
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
import java.util.*;
public class Catalogo
{
public static int nAutos = 5;
public static int nScooters = 3;
37
///////////////////////////////////////////////////////////////
Ejecutamos en Eclipse
///////////////////////////////////////////////////////////////
Qué tipo de vehículo desea utilizar: Vehículos eléctricos (1) o a gasolina (2):1
Automovil electrico de modelo: Estandar de color: Blanco de potencia: 6 de espacio: 3.2
Automovil electrico de modelo: Estandar de color: Blanco de potencia: 7 de espacio: 3.2
Automovil electrico de modelo: Estandar de color: Blanco de potencia: 8 de espacio: 3.2
Automovil electrico de modelo: Estandar de color: Blanco de potencia: 9 de espacio: 3.2
Automovil electrico de modelo: Estandar de color: Blanco de potencia: 10 de espacio: 3.2
Scooter electrica de modelo: Clásico de color: Azul de potencia: 2
Scooter electrica de modelo: Clásico de color: Azul de potencia: 3
Scooter electrica de modelo: Clásico de color: Azul de potencia: 4
////////////////////////////////////////////////////////////////////
38
Imagen de Resumen tomado de (Bustacara, 2019)
Ejercicios propuestos.
1.-Un ejemplo de Abstract Factory, se encuentra en un equipo de estampado de
chapa metálica utilizado en la fabricación de automóviles japoneses. El equipo
de estampado es una fábrica abstracta que crea partes de carrocería. La misma
maquinaria se utiliza para sellar puertas de la derecha, puertas de la izquierda,
guardabarros delanteros derechos, guardabarros delanteros izquierdos,
capuchas, etc. para diferentes modelos de automóviles. Mediante el uso de
rodillos para cambiar las matrices de estampado, las clases concretas
producidas por la maquinaria se pueden cambiar en tres minutos
(SourceMaking, 2019).
39
Estampado de chapa metálica tomado de (SourceMaking, 2019)
Defina una interfaz de fábrica que conste de un método de fábrica por producto.
Defina una clase derivada de fábrica para cada plataforma que encapsule todas
las referencias al operador new
El cliente debe retirar todas las referencias new y utilizar los métodos de fábrica
para crear los objetos del producto.
41
Sesión 4
El Patrón Builder
El objetivo del patrón Builder es abstraer la construcción de objetos complejos
de su implementación, de modo que un cliente pueda crear objetos complejos
sin tener que preocuparse de las diferencias en su implantación (Debrauwer,
2013).
Así podemos decir que el patrón Builder se aplica si se necesita crear objetos
complejos compuestos de varias partes independientes.
42
Ejemplo de aplicación.
43
El vendedor realiza, a continuación, la solicitud de creación de cada
documento mediante esta instancia. De este modo el vendedor genera la
documentación con ayuda de los métodos construyeSolicitudPedido y
construyeSolicitudMatriculación.
2.-Participantes
Los participantes del patrón son los siguientes:
44
Director es la clase encargada de construir el producto a partir de la
interfaz del constructor abstracto.
3.- Colaboraciones
El cliente crea un constructor concreto y un director. El director construye, bajo
demanda del cliente, invocando al constructor y reenvía el resultado al cliente.
45
El Patrón Factory Method
El objetivo del patrón Factory Method es proveer un método abstracto de
creación de un objeto delegando en las subclases concretas su creación efectiva.
O sea, podemos utilizar este patrón cuando definamos una clase a partir de la
que se crearán objetos pero sin saber de qué tipo son, siendo otras subclases las
encargadas de decidirlo. ¡Interesante, verdad!.
46
Ejemplo de aplicación
47
La clase concreta ClienteContado cuyo método creaPedido crea una instancia
de la clase PedidoContado.
La clase concreta ClienteCrédito cuyo método creaPedido crea una instancia
de la clase PedidoCrédito.
2.- Participantes
Los participantes del patrón en el ejemplo mostrado son los siguientes:
3.- Colaboraciones
Los métodos concretos de la clase CreadorAbstracto se basan en la
implementación del método de fabricación en las subclases. Esta
implementación crea una instancia de la subclase adecuada de Producto.
48
Práctica de Laboratorio:Código Java para el Patrón Builder
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
import java.util.*;
////////////////////////////////////////////////////////////
49
A continuación, las clases que generan Documentacion
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
50
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
51
solicita al usuario el constructor que debe utilizar, y se lo proporciona a
continuación al vendedor.
////////////////////////////////////////////////////////////
import java.util.*;
public class ClienteVehiculo
{
public static void main(String[] args)
{
Scanner reader = new Scanner(System.in);
ConstructorDocumentacionVehiculo constructor;
System.out.print("Desea generar " +
"documentacion HTML (1) o PDF (2):");
String seleccion = reader.next();
if (seleccion.equals("1"))
{
constructor = new ConstructorDocumentacionVehiculoHtml();
}
else
{
constructor = new ConstructorDocumentacionVehiculoPdf();
}
Vendedor vendedor = new Vendedor(constructor);
Documentacion documentacion = vendedor.construye("Maluma","Ozuna");
documentacion.imprime();
}
}
////////////////////////////////////////////////////////////
Ejecución:
////////////////////////////////////////////////////////////
52
Práctica de Laboratorio:Código para el Patrón Factory Method
//////////////////////////////////////////////////
/////////////////////////////////////////////////
53
/////////////////////////////////////////////////
package principal;
public class PedidoCredito extends Pedido
{
public PedidoCredito(double importe)
{
super(importe);
}
@Override
public boolean valida()
{
return (importe >= 5000.0) && (importe <= 12000.0);
}
}
/////////////////////////////////////////////////
/////////////////////////////////////////////////
import java.util.*;
public abstract class Cliente
{
protected List<Pedido> pedidos =
new ArrayList<Pedido>();
/////////////////////////////////////////////////
54
public class ClienteContado extends Cliente
{
protected Pedido creaPedido(double importe)
{
return new PedidoContado(importe);
}
}
/////////////////////////////////////////////////
/////////////////////////////////////////////////
/////////////////////////////////////////////////
package principal;
public class Usuario
{
public static void main(String[] args)
{
Cliente cliente;
cliente = new ClienteContado();
cliente.nuevoPedido(6000.0);
cliente.nuevoPedido(9000.0);
cliente = new ClienteCredito();
cliente.nuevoPedido(6000.0);
cliente.nuevoPedido(9000.0);
}
}
/////////////////////////////////////////////////
Observar que mientras el nuevo pedido se encuentre dentro del rango de crédito
la operación se desarrolla con éxito, fuera del rango no.
55
Sesión 5
El Patrón Prototype
Este patrón se utilizará si necesitamos crear y manipular copias de otros objetos,
consiste en la creación de nuevos objetos mediante duplicación de
objetos existentes llamados prototipos que disponen de la capacidad de
clonación (informaticapc.com, 2019), (Debrauwer, 2013).
56
Ejemplo completo tomado de (Debrauwer, 2013).
57
documentaciones compuestas por diversos documentos obligatorios. Para cada
tipo de documento, se incluye su clase correspondiente.
El Patrón Prototype usa esta técnica basada en objetos que poseen la capacidad
de clonación y los documentos constituyen los distintos prototipos.
58
2. Participantes
Los participantes del patrón son los siguientes:
3. Colaboración
El cliente solicita a uno o varios prototipos que se dupliquen a sí mismos.
4. Ámbito de aplicación
El patrón Prototype se utiliza en los dominios siguientes:
-Un sistema de objetos debe crear instancias sin conocer la jerarquía de clases
59
El Patrón Singleton
-Se usa el patrón Singleton cuando por alguna razón se necesita que exista sólo
una instancia (un objeto) de una determinada Clase.
-El patrón Singleton tiene como objetivo asegurar que una clase sólo posee una
instancia y proporciona un método de clase único que devuelve esta instancia.
En ciertos casos es útil gestionar clases que posean una única instancia.
60
Ejemplo de creación de una Mototaxi
//////////////////////////////////////////////////
package Singleton;
private Mototaxi() {
}
public static Mototaxi getInstancia()
{
if (instancia == null) {
instancia = new Mototaxi();
System.out.println("El objeto Mototaxi ha sido
creado");
}
else {
System.out.println("Ya existe el objeto Mototaxi");
}
return instancia;
}
}
//////////////////////////////////////////////////////////////
package Singleton;
////////////////////////////////////
/////////////////////////////////////////////
61
En el código anterior, cuando se procesa el bucle for se llama al método
getInstancia() de la clase Mototaxi, devolviéndose siempre una misma
instancia (un sólo objeto) de dicha clase (que será creada la primera vez que se
llame a dicho método).
2. Participante
El único participante es la clase Singleton, que ofrece acceso a la instancia
única mediante el método de clase Instance.
Por otro lado, la clase Singleton posee un mecanismo que asegura que sólo
puede existir una única instancia. Este mecanismo bloquea la creación de otras
instancias.
3. Colaboración
Cada cliente de la clase Singleton accede a la instancia única mediante el
método de clase Instance. No puede crear nuevas instancias utilizando el
operador habitual de instanciación (operador new), que está bloqueado.
4- Ámbito de aplicación
El patrón se utiliza en el siguiente caso:
62
Práctica de Laboratorio: Código Java para el Patrón Prototype
///////////////////////////////////////////////////////////////////////////////////
try
{
resultado = (Documento)this.clone();
}
catch (CloneNotSupportedException exception)
{
return null;
}
return resultado;
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
63
public void imprime()
{
System.out.println(
"Imprime la Solicitud de Matriculación: " + contenido);
}
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
import java.util.*;
public abstract class Documentacion
{
protected List<Documento> documentos;
///////////////////////////////////////////////////////////////////////////////////
import java.util.*;
public class DocumentacionEnBlanco extends Documentacion
{
private static DocumentacionEnBlanco una_instance = null;
private DocumentacionEnBlanco()
{
64
documentos = new ArrayList<Documento>();
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
import java.util.*;
public class DocumentacionCliente extends Documentacion
{
public DocumentacionCliente(String informacion)
{
documentos = new ArrayList<Documento>();
DocumentacionEnBlanco documentacionEnBlanco = DocumentacionEnBlanco.Instancia();
List<Documento> documentosEnBlanco = documentacionEnBlanco.getDocumentos();
for (Documento documento: documentosEnBlanco)
{
Documento copiaDocumento = documento.duplica();
copiaDocumento.rellena(informacion);
documentos.add(copiaDocumento);
}
}
///////////////////////////////////////////////////////////////////////////////////
65
{
//inicializacion de la documentacion en blanco
DocumentacionEnBlanco documentacionEnBlanco =
DocumentacionEnBlanco.Instancia();
documentacionEnBlanco.incluye(new OrdenDePedido());
documentacionEnBlanco.incluye(new CertificadoCesion());
documentacionEnBlanco.incluye(new SolicitudMatriculacion());
/////////////////////////////////////////////
66
Sesión 6
Carácterísticas
Las interfaces son el mecanismo más usual de estos patrones.
67
Composición estática
Si se desea varias implementaciones posibles, la solución clásica consiste en diferenciarlas a nivel de las
subclases. Es el caso de uso de la herencia de una interfaz en varias clases de implementación. Esta solución
consiste en realizar una composición estática. De manera que, una vez escogida la clase de implementación de
un objeto, no es posible cambiarla.
Composición dinámica
68
Patrón estructural y su función principal
PATRÓN función
Adapter: Adapta un objeto existente.
Bridge Implementa un objeto.
Composite Organiza la composición jerárquica de un objeto.
Decorator Se sustituye el objeto existente agregándole nuevas
funcionalidades.
Facade Se sustituye un conjunto de objetos existentes confiriéndoles
una interfaz unificada.
Flyweight Está destinado a la compartición y guarda un estado
independiente de los objetos que lo referencian.
Proxy Se sustituye el objeto existente otorgando un comportamiento
adaptado a necesidades de optimización o de protección.
Patrón Adapter
Este patrón permite que trabajen juntas clases con interfaces incompatibles.
Para ello, un objeto adaptador reenvía al otro objeto los datos que recibe (a
través de los métodos que implementa, definidos en una clase abstracta o
interface) tras manipularlos en caso necesario. (informaticapc.com, 2019)
69
Patrón Bridge
Este patrón permite desacoplar una abstracción de su implementación, de
manera que ambas puedan variar de forma independiente.
Tenemos un caso: Una clase abstracta en la que se define un método que deberá
implementar cada clase que herede de ella: ¿cómo haríamos si una clase hija
necesitase implementarlo de forma que realizase acciones diferentes
dependiendo de determinadas circunstancias?
En dichos casos nos resultaría útil el patrón Bridge (puente) ya que 'desacopla
una abstracción' (un método abstracto) al permitir indicar (durante la ejecución
del programa) a una clase qué 'implementación' del mismo debe utilizar (qué
acciones ha de realizar) (informaticapc.com, 2019).
70
Patrón Composite
Este patrón permite crear y manejar estructuras de objetos en forma de árbol,
en las que un objeto puede contener a otro(s). Las estructuras de este tipo se
componen de nodos (un objeto que a su vez contiene otros objetos) y Hojas
(objetos que no contienen otros), y que ambos comparten una misma Interface
que define métodos que deben implementar.
71
Práctica de Laboratorio: Código Java para el Patrón Adapter
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
package estructurales.adapter.adapter01;
///////package estructurales.adapter.adapter01;
// -----------------
public CajaDolares() {
}
// -----------------
// -----------------
// -----------------
/////////////////////////////////////////////////////
package estructurales.adapter.adapter01;
72
public class Adaptador implements IAdaptador
{
CajaDolares cajaDolares = new CajaDolares();
// ------------------
public Adaptador() {
}
// ------------------
// ------------------
@Override
public void sacarSoles( double soles )
{
double dolares = soles / 3.359865432;
cajaDolares.sacarDolares( dolares );
}
// ------------------
@Override
public void ingresarSoles( double soles )
{
double dolares = soles / 3.359865432;
cajaDolares.ingresarDolares( dolares );
}
}
////////////////////////////////////////////////////////////
package estructurales.adapter.adapter01;
conversor.ingresarSoles( 1000 );
conversor.ingresarSoles( 9000 );
conversor.ingresarSoles( 15000 );
////////////////salida//////////////////////////
////////////////////////////////////////////////////////////
73
Práctica de Laboratorio: Código Java para el Patrón Bridge
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
package estructurales.bridge.bridge01;
////////////////////////////////////////////////////////////
package estructurales.bridge.bridge01;
// --------------------------
@Override
public void procesar()
{
// Operaciones necesarias
// ...
////////////////////////////////////////////////////////////
package estructurales.bridge.bridge01;
// --------------------------
@Override
public void procesar()
{
74
// Operaciones necesarias
// ...
////////////////////////////////////////////////////////////
package estructurales.bridge.bridge01;
String nombre;
// --------------------------
// --------------------------
// --------------------------
////////////////////////////////////////////////////////////
package estructurales.bridge.bridge01;
// ------------------------
@Override
public void obtener()
{
System.out.println("Preparando tu cevichiiiito...");
this.getImplementador().procesar();
75
}
}
////////////////////////////////////////////////////////////
package estructurales.bridge.bridge01;
cevichito.obtener();
///////////////////salida/////////////////////////////
Preparando tu cevichiiiito...
Ceviche preparado con Pescado Fresco
Preparando tu cevichiiiito...
Ceviche preparado con Pescado Salpreso
////////////////////////////////////////////////////////////
76
Práctica de Laboratorio: Código Java para el Patrón Composite
////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////
package estructurales.composite.composite01;
// ----------------------------
// ----------------------------
// ----------------------------
// ----------------------------
// ----------------------------
77
////////////////////////////////////////////////////////////
package estructurales.composite.composite01;
// ----------------------------
@Override
public void mostrar()
{
System.out.println( "Archivo: [" + this.getNombre() + "]" );
}
}
////////////////////////////////////////////////////////////
package estructurales.composite.composite01;
import java.util.ArrayList;
import java.util.List;
// ----------------------------
// ----------------------------
// ----------------------------
// ----------------------------
// ----------------------------
// ----------------------------
@Override
public void mostrar()
{
System.out.println("Listando carpeta [" + this.getNombre() + "]" );
System.out.println("=====================================");
////////////////////////////////////////////////////////////
package estructurales.composite.composite01;
F1.mostrar();
System.out.println("--------------------");
////////////////////////salida///////////////////////////
////////////////////////////////////////////////////////////
80