0% encontró este documento útil (0 votos)
15 vistas81 páginas

Patrones

El documento describe el patrón de diseño Singleton. Explica que este patrón asegura que una clase tenga una única instancia y proporciona un punto de acceso global a ella. Se detallan algunos problemas comunes en la implementación del patrón, como la serialización y el uso de hilos. También se mencionan ejemplos como objetos de configuración global y pools que se benefician de este patrón.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
15 vistas81 páginas

Patrones

El documento describe el patrón de diseño Singleton. Explica que este patrón asegura que una clase tenga una única instancia y proporciona un punto de acceso global a ella. Se detallan algunos problemas comunes en la implementación del patrón, como la serialización y el uso de hilos. También se mencionan ejemplos como objetos de configuración global y pools que se benefician de este patrón.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 81

12ª

Emisión

Módulo 2
Principios y Patrones de Diseño
Mtro. Alfonso Gregorio Rivero Duarte
Objetivo

Aprender patrones de diseño, para poderlos aplicar al proyecto final

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Lo que veremos

• Que es un Patrón de diseño


• Creational Patterns
• Structural Patterns
• Behavioral Patterns

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
¿Qué es un Patrón?

Se puede decir que un patrón son soluciones probadas para un problema en especifico,
estos nos ayudaran a comprender a la perfección los principios fundamentales de
diseño.

Las decisiones del diseño nos brindan la posibilidad de identificar los módulos de un
sistema de software y como funcionaran estos módulos juntos para alcanzar los
objetivos.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
GoF

1994 Design patterns:


Elements of Reusable Object-Oriented Software

• Erich Gamma
• Richard Helm
• Ralph Johnson
• John Vissides

Gang of Fourà GoF

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Criterios de Diseño

• Variaciones protegidas: Si se piensa que un componente podría cambiar, utilice


interfaces, estas permiten cambiar la clase de implementación sin afectar las
dependencias existentes.

• Bajo acoplamiento: Esto debe aplicarse para que los cambios hechos en un sección
no afecten a otras secciones relacionadas o no relacionadas, el clásico efecto es si
hacemos un cambio en la interfaz gráfica y tengamos que cambiar algo en la base de
datos, es frágil la aplicación.

• Alta cohesión: Si una clase tiene una única responsabilidad.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Categorías de los Patrones

Creational Structural Behavioral


• Abstract factory pattern • Adapter • Chain of responsability
• Builder pattern • Bridge • Command
• Factory method pattern • Composite • Interpreter
• Prototype pattern • Decorator • Iterator
• Singleton pattern • Facade • Mediator
• Flyweight • Observer
• Proxy • State
• Strategy
• Template method
• Visitor

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern

Diseñar una máquina de reconocer monedas


Máquina de refrescos / café
Hoy en día son muy sofisticadas y ocupan mucho del HW para poder funcionar

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern

¿Es de 10, 5, 2, 1, 0.5… ?

Estructura Monolítica
Difícil reusar partes
Complicado mantenimiento:
¿Añadir una moneda?
¿Quitar una moneda?

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern

¿ Y si diseñamos que reconozca 1 moneda ?

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern

Sencillo
Mantenible
Usable

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Primer pattern

¿Es aplicable a otros problemas?

• Una incidencia llega a un empleado. ¿La puede tratar él o delega en un superior?


• Un paciente llega a un centro de atención primaria. ¿Lo tratan ahí o lo llevan a un
hospital?
• Un servicio web SOAP permite registrar “handlers”. Cada uno de ellos puede indicar
si es capaz de procesar un mensaje concreto o no.
• JDBC debe conectarse a una BD en concreto y tiene una lista de drivers candidatos.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Chain of Responsability pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Chain of Responsability pattern

“Avoid coupling the sender of a request to its receiver by giving more than one object a
chance to handle the request. Chain the receiving objects and pass the request along
the chain until an object handles it.”

Chain of Responsibility es un patrón de diseño de comportamiento que te permite


pasar solicitudes a lo largo de una cadena de manejadores. Al recibir una solicitud,
cada manejador decide si la procesa o si la pasa al siguiente manejador de la cadena.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Design Patterns Simplified

https://refactoring.guru/es/design-patterns

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

Objetivo: Crear un objeto para una única instancia, por ejemplo para configuraciones
globales, para almacenar registros o pools de conexiones.

Técnica: Una clase tiene una sola instancia y debe proporcionar acceso global.

Ejemplo: Se necesita crear un único objeto que permita guardar datos en archivos.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

Ejemplos:
De los más sencillos y quizás el más polémico del catálogo.
La idea es muy sencilla. La parte más interesante es implementarlo de forma segura.
Conceptualmente no tiene complejidad, pero existen serie de errores que se pueden
cometer en la implementación.
Objetos que necesitamos se creen una sola vez:
Registros
Preferencias globales o configuración
Login
Caches
Pools

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

Su intención consiste en garantizar que una clase solo tenga una instancia y
proporcionar un punto de acceso global a ella.
El patrón singleton se implementa creando en nuestra clase un método que crea una
instancia del objeto solo si todavía no existe alguna. Para asegurar que la clase no puede
ser instanciada nuevamente se regula el alcance del constructor (con modificadores de
acceso como protegido o privado).
La instrumentación del patrón puede ser delicada en programas con múltiples hilos de
ejecución. Si dos hilos de ejecución intentan crear la instancia al mismo tiempo y esta no
existe todavía, solo uno de ellos debe lograr crear el objeto. La solución clásica para este
problema es utilizar exclusión mutua en el método de creación de la clase que
implementa el patrón.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

Las situaciones más habituales de aplicación de este patrón son aquellas en las que
dicha clase controla el acceso a un recurso físico único (como puede ser el ratón o un
archivo abierto en modo exclusivo) o cuando cierto tipo de datos debe estar disponible
para todos los demás objetos de la aplicación.

“Ensure a class only has one instance, and provide a global point of Access to it.”

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

¿Problemas?
public class Unico implements Serializable {
private static Unico INSTANCE;
public static Unico getUnico(){
if (INSTANCE == null) {
INSTANCE = new Unico();
}
return INSTANCE;
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

¿Más Problemas?
public class Unico implements Serializable {
private static Unico INSTANCE;
private Unico(){}
public static Unico getUnico(){
if (INSTANCE == null) {
INSTANCE = new Unico();
}
return INSTANCE;
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

¿Más Problemas?
public class Unico implements Serializable {
private static Unico INSTANCE;
private Unico(){}
Public synchronized static Unico getUnico(){
if (INSTANCE == null) {
INSTANCE = new Unico();
}
return INSTANCE;
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

public class Unico implements Serializable {


private static Unico INSTANCE;
private Unico(){}
Public synchronized static Unico getUnico(){
if (INSTANCE == null) {
INSTANCE = new Unico();
}
return INSTANCE;
}
Controla la des-serialización
private Object readResolve() { de un objeto
return INSTANCE;
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

A partir de Java 1.5 se recomienda usar Enums con una sola instancia
public enum Unico {
INSTANCE;
//metodos;
}

Unico unico = Unico.INSTANCE;

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

package dgtic.inicio;
import dgtic.modelo.Archivo;
public class Inicio {
public static void main(String[] args) {
Archivo archivo=Archivo.getInstancia();
Archivo archivoDos=Archivo.getInstancia();
System.out.println(archivo.equals(archivoDos));
System.out.println(archivoDos.equals(archivo));
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Singleton Pattern

¿Y qué mejora se ofrece?

Usar enums!

Public enum UNICO {


INSTANCE;
}

Unico unico = Unico.INSTANCE;


Eager Singleton
Public class EagerSingleton {
private static final EagerSingleton INSTANCE = new EagerSingleton();

private EagerSingleton() {}

public static EagerSingleton getInstance() {


return INSTANCE;
}
}
Lazy Singleton
Public class LazySingleton {
private static final LazySingleton INSTANCE;

private LazySingleton() {}

public static LazySingleton getInstance() {


if (INSTANCE is null) {
synchronized(LazySingleton.class) {
if (INSTANCE is null) {
INSTANCE = new LazySingleton();
}
}
}
return INSTANCE;
}
}
Abstract Factory pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Abstract Factory pattern

Objetivo: Necesitamos crear colecciones de clases, pero no necesitamos indicar el tipo


concreto de la clase a usar, dado que puede variar de una situación a otra.

Técnica: Poder definir interfaces o clases abstractas para crear objetos, y dejar que las
subclases decidan qué clase instanciar.

Ejemplo: Quieren los clientes ocupar conexiones de base de datos de dos paradigmas
diferentes, modelo relacional y el modelo no relacional, de sus dos repositorios
profesores y materias.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Práctica Abstract factory pattern versión 1

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Abstract Factory pattern

Sin embargo, con la anterior propuesta, estaríamos duplicando muchísimo código


innecesariamente
Cada vez que apareciese un nuevo tipo de DB, hay que modificar todos los puntos
donde se crean estos tipos.

"Provide an interface for creating families of related or dependent objects without


specifying their concrete classes."

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Abstract factory Pattern versión 2

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Abstract factory pattern versión 2
package dgtic.inicio;
import dgtic.repositorio.implementacion.FactoryNoSQL;
import dgtic.repositorio.implementacion.FactoryRelacional;
import dgtic.repositorio.interfaces.RepositorioAbstractFactory;
import dgtic.repositorio.interfaces.RepositorioMaterias;
import dgtic.repositorio.interfaces.RepositorioProfesores;
public class Principal {
public static void main(String[] args) {
RepositorioAbstractFactory factory=new FactoryRelacional();
RepositorioProfesores rep=factory.crearRespositorioProfesores();
rep.listaProfesores();

RepositorioAbstractFactory factoryDos=new FactoryNoSQL();


RepositorioMaterias repDos=factoryDos.crearRespositorioMaterias();
repDos.listaMaterias();
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Abstract Factory pattern

Resumiendo

Este pattern permite que en caso de que nuestra aplicación utilice familias de objetos
diferentes según el entorno, podamos centralizar la decisión de qué tipo de objetos
crear en un solo punto.
Se simplifica el código cliente, y más, el sistema puede extenderse de forma mucho
más fácil.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Builder Pattern
Builder Pattern

Objetivo: Crear un objeto con muchas opciones de posibles de configuración. Es decir


construir objetos complejos.

Técnica: Para la construcciones de objetos complejos separa el proceso de construcción


de su representación.

Ejemplo: Los clientes desean construir un objeto profesor, con la diferencia que en
tiempo de compilación si tiene base, que indique en que departamento esta o si tiene
asignatura indicar las materias que imparte.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Builder Pattern

Permite resolver de una forma muy elegante, un problema en Java.


Limitaciones de crear objetos si usamos solo directamente los constructores

Ejemplo:

Necesitamos una clase Persona, con nombre y edad (los dos obligatorios).
Builder Pattern

También nos piden el municipio, pero éste es opcional.


Por lo tanto creamos dos constructores diferentes.
Si es menor de edad, es obligatorio el colegio. Si es mayor de edad, informar sobre su trabajo.

private String nombre;


private int edad:

public Persona (String nombre, int edad) {


this.nombre = nombre,
this.edad = edad;
}
Builder Pattern

public Persona(String nombre, int edad) {}

public Persona(String nombre, int edad, String municipio) {}

public Persona(String nombre, int edad, String municipio, String colegio) {}

public Persona(String nombre, String municipio, String colegio) {}

public Persona(String nombre, String colegio)

El problema se vuelve mucho mas grande.


Hay muchas generaciones de constructores
Ya no es agradable trabajar con el
Builder Pattern

"Separate the construction of a complex object from its representation so that the same
construction process can create different representations.“

Por lo tanto, debemos crear una nueva clase cuya única responsabilidad es crear objetos de tipo
Persona.
Builder Pattern

Constructor de Persona private. Acceso solo mediante “Builder”.

Persona madre = new Persona.Builder(“Maria”)


.setMunicipio(“Alvaro Obregon”)
.setMayor(37, “Google”)
.build();

Persona hijo = new Persona.Builder(“Pedro”)


.setMenor(4, “Colegio Morones”)
.build();
Builder Pattern

El nombre de persona es obligatorio


El municipio es diferente, es opcional.
Agregar opcionales no nos fuerza a crear nuevos constructores.

Añadir nuevo método SET y el cliente elige si invocarlo o no.


Hay métodos específicos al tipo de persona.
Lugar de trabajo a mayores de edad y colegio para menores
Los métodos builder devuelven en cada invocación una referencia a un mismo builder para poder así
encadenar distintas invocaciones
Method chaining
Builder Pattern
public static class Builder {
private Persona persona;

public Builder(String nombre) { Obligatorios


persona = new Persona(); comunes
persona.nombre = nombre;
}

public Builder setMunicipio(String municipio) { Opcionales


persona.municipio = municipio;
Method
return this;
Chaining
}
//…
public Persona build(){
return persona;
}
}
Builder Pattern
Lo va inicializando conforme se invocan los distintos métodos.
El builder puede utilizar el constructor de la clase persona (aunque sea privado) porque la clase
builder esta incluída dentro de la misma clase persona (clase public static).

public Builder setMenor(int edad, String colegio) {


if (edad >= 18)
throw new IllegalArgumentException(“Es mayor de edad ” + edad);
persona.edad = edad;
persona.colegio = colegio;
persona.lugarTrabajo = null;
return this;
}

Ahora… (nuevos requerimientos)


Tanto colegio como lugar de trabajo son opcionales.
Puede haber más propiedades exclusivas a mayores y menores de edad
Queremos que el compilador nos guíe mostrando solo las “correctas”.
Builder Pattern
Persona madre = new Persona.Builder(“Maria”)
.setMunicipio(“Alvaro Obregon”)
.setMayor(37, “Google”)
.build();

Persona hijo = new Persona.Builder(“Pedro”)


.setMenor(4, “Colegio Morones”)
.build();

Persona mal = new Persona.Builder(“Luisa”).


.setMayor(20) No Compila!
.setColegio(“Colegio Morones”)
.build();
Builder Pattern

La tercera NO debería compilar


El código debe fallar en la COMPILACIÓN, no en TIEMPO DE EJECUCIÓN
Si queremos que el compilador nos ofrezca posibilidades diferentes según si la persona es mayor o
menor, necesitaremos distintos builders.

Este pattern existe por defecto al usar API de terceros como Spring / Hibernate
Este pattern ayuda a entender mejor estas API
Builder Pattern
public Builder setMayor(int edad) {
if (edad < 18)
throw new IllegalArgumentException(“Es menor de edad ” + edad);
persona.edad = edad; public class BuilderMayor {
return new Persona.BuilderMayor(persona); private Persona persona;
}
public BuilderMayor(Persona persona) {
public Persona build() { this.persona = persona;
return persona; }
}
public BuilderMayor setLugarTrabajo(String trabajo) {
persona.lugarTrabajo = trabajo;
}

public Persona build() {


return persona;
}
}
Builder Pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Builder Pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Builder Pattern
package fes.aragon.inicio;
import fes.aragon.modelo.Departamento;
import fes.aragon.modelo.Materias;
import fes.aragon.modelo.Profesor;
import fes.aragon.modelo.Tipo;
public class Principal {
public static void main(String[] args) {
Profesor profesor=new Profesor.Builder("Fernando")
.setTipoBase(Tipo.BASE)
.setDepartamento(Departamento.COMPUTACION)
.build();
Profesor profesorDos=new Profesor.Builder("Maria")
.setTipoAsignatura(Tipo.ASIGNATURA)
.setMaterias(Materias.ALGEBRA,Materias.CALCULO)
.build();
System.out.println(profesor.toString());
System.out.println(profesorDos.toString());
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern
Factory Method Pattern

Objetivo: Definir una interfaces para crear un objeto, pero se dejar a las subclases que
clase concreta instanciar.

Técnica: Utilizar una interfaz (clase abstracta o interfaz), y las subclases indicaran el tipo
de clase a instanciar.

Ejemplo: Se quiere construir un objeto de tipo reloj, pero las subclases deben definir el
tipo de cristal, ya sea de vidrio o platico.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern

Nos ayudará cuando necesitemos crear objetos con una inicialización compleja
O viene un tipo devuelto o algunos de sus componentes puede variar según la situación

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern

Siguiendo el ejemplo, hay que crear clases del tipo Coche, sin embargo, la gran
diferencia es que se pueden crear con distintos tipos de mandos.

//estamos en Inglaterra, sino usar piloto izq


Coche coche = new CochePilotoDerecha();
coche.ponerChasis();
coche.ponerMandos();
coche.ponerRuedas();
//usar coche

Problema: como encapsular la creación e inicialización del objeto, si este puede tener
distintos tipos?
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern

"Define an interface for creating an object, but let subclases decide which class to instantiate. The Factory
Method lets a class defer instantiation it uses to subclasses.“

Uso del término interface no es término de interface en java, sino interface que ataca al cliente.
La clase que es usada por el cliente creara el objeto con toda su inicialización pero delegará en subclases
concretas que tipos específicos tiene que crear
public abstract class CocheFactory {
public Coche crea() {
Coche coche = creaCoche();
coche.ponerChasis();
coche.ponerMandos();
coche.ponerRuedas();
return coche;
}
protected abstract Coche creaCoche();
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern

CocheFactory con un metodo ‘crea’ se encarga de devolver un coche completamente inicializado


El tipo concreto de coche se deja para las subclases específicas declarando el método abstract ‘creaCoche’
public class CocheInglesFactory extends CocheFactory {
@Override
protected Coche creaCoche() {
return new CochePilotoDerecha();
}
}

CocheFactory factory = new CocheInglesFactory();


Coche coche = factory.crea();

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern

Ahora cada tipo de coche particular tendría una implementación de CocheFactory indicando el tipo de
coche a crear.
El cliente decidiría que tipo de Factory usar pero siempre usaría el método crea para obtener el coche.

Cliente

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Factory Method Pattern

package dgtic.inicio;
import dgtic.modelo.Reloj;
import dgtic.modelo.interfaz.RelojCristalPlasticoFactory;
import dgtic.modelo.interfaz.RelojCristalVidrioFactory;
import dgtic.modelo.interfaz.RelojFactory;
public class Inicio {
public static void main(String[] args) {
RelojFactory factory=new RelojCristalPlasticoFactory();
Reloj reloj=factory.crea();
System.out.println(reloj.toString());

RelojFactory factoryDos=new RelojCristalVidrioFactory();


Reloj relojDos=factoryDos.crea();
System.out.println(relojDos.toString());
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern

Objetivo: Se necesita comunicar dos interfaces que son incompatibles.

Técnica: Ocupar los principios de delegación, herencia y abstracción.

Ejemplo: Se tienen perros que corren, caminan y buscan cosas, pero también tenemos
perros viejos que solo caminan y duermen, se quiere unir las dos clases de perros para
una exposición canina.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern

Muchos patterns nos facilitan la extensión de la aplicación sin necesidad de modificar el


código ya escrito y testeado.
Estas extensiones se realizan mediante puntos de extensión que vamos dejando en
nuestras clases en forma de métodos abstractos.
Casos donde a priori hemos podido prever por donde se va a extender nuestro Sistema
Si nos imponen cambios que son imposibles o casi imposibles de prever inicialmente.
Este pattern forma parte de éste arsenal de recursos para estas situaciones.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern

Tenemos una aplicación de reservas.


Construímos una interface que captura de la mejor forma que se nos ocurre la
funcionalidad básica que proporciona nuestro Sistema.
ReservasSL permite obtener información del hotel, crear reserve y obtener los datos de
la reserva.
Creamos una clase que implementa la funcionalidad de la interface.
public interface ReservasSL {
String holetInfo(String idHotel);
long creaReserva(String idHotel, String cliente, Date fecha, int dias);
String datosReserva(long codigo);
}

public class MiSistemaReservas implements ReservasSL {}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
public class MiSistemaReservas implements ReservasSL, StandardReservasACME {
@Override
public String getInfoHotel(String idHotel) {
return hotelInfo(idHotel);
}
@Override
Public String hotelInfo (String idHotel) {
return “info del hotel “ + idHotel;
}
}

Dos métodos diferentes hace "lo mismo".


La clase hace dos trabajos diferentes
Rompe igual SRP y OCP
Hay que modificar la clase existente para cada estándar al que queramos integrarnos
Estandar1: getInfo(String reserva)
Estandar2: getInfo(String hotel)
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern

NO TOCAR la clase existente que implementa ReservasSL y crear una nueva clase que
implemente la nueva interface StandardReservaACME.

Este no implementará la funcionalidad desde cero sino que obtendrá en su construcción


una implementación ya existente y traducirá las llamadas usando la nueva interface a la
interface antigua usando este objeto recuperado en el constructor.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern
public class StandardReservasACMEAdapter implements StandardReservasACME {
private ReservasSL miSistema,
public StandardReservasACMEAdapter (ReservasSL miSistema) {
this.miSistema = miSistema;
}
@Override
public String getInfoHotel(String idHotel){
return miSistema.hotelInfo(idHotel);
}
@Override
public String createReservation(Date fecha, int días, String idHotel, String cliente) {
long código = miSistema.creaReserva(idHotel, cliente, fecha, dias);
return String.valueOf(codigo);
}
@Override
public String getReservation(String codigo) {
long codigoLong = Long.parseLong(codigo);
return miSistema.datosReserva(codigoLong);
}
}
DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Adapter Pattern

La interface Nueva se implementa con una nueva clase en el rol de Adapter.


En la práctica el Adapter la hace de "Envoltorio".

Otra aproximación interesante podría ser:

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Adapter Pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Ejercicio Adapter Pattern
package dgtic.inicio;
import dgtic.adapter.ViejoPerroAdaptador;
import dgtic.modelo.PerroJoven;
import dgtic.modelo.PerroViejo;
import dgtic.servicio.ExposicionCanina;
public class Inicio {
public static void main(String[] args) {
PerroViejo viejo=new PerroViejo("Rojo");
PerroJoven nuevo=new PerroJoven("Negro");
ViejoPerroAdaptador adapta=new ViejoPerroAdaptador(viejo);
ExposicionCanina expo=new ExposicionCanina();
expo.competencia(adapta);
System.out.println("-----");
expo.competencia(nuevo);
}
}

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern
Mediator Pattern

Objetivo: Poder encapsular como se interactúan con un conjunto de objetos

Técnica: Encapsular en un solo objeto la lógica de negocio que se necesita para


interactuar con los otros objetos.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern

Ejemplo: Se tiene un conjunto de sistemas individuales que controlan la televisión,


radio, lámparas y despertador.

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern

El cliente pide una serie de reglas:


• Si el despertador se enciende, la luz debe de encenderse
• Si se apaga la alarma, entonces se enciende la radio
• La alarma también se apaga encendiendo la luz
• Si se enciende la radio, la tele debe bajar el volumen
• Si se enciende la tele, la radio se apaga y la luz baja la
intensidad…

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern
Mediator Pattern

Implementación directa:

Mediator tendrá una referencia a cada aparato que deba modificar

Cada aparato tendrá una referencia hacia el mediator

Desaparecen las referencias a los aparatos individuales (entre ellos)

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Mediator Pattern

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Lo que aprendimos

• Comprender que es un Patrón de diseño


• Identificar como ocupar los patrones:
• Creational Patterns
• Structural Patterns
• Behavioral Patterns

DIPLOMADO
Desarrollo de Sistemas con Tecnología Java DDTIC_DSJ_PLI_2021
Contacto

Mtro. Alfonso Gregorio Rivero Duarte

Tech Lead - MIDAS TECHNOLOGIES

[email protected]

Tels: 5528997069

Redes sociales:

https://www.linkedin.com/in/alfonso-gregorio-r-139a9225/

También podría gustarte