187
Tema 6: Patrones de Dise˜ no Dise˜ no Software (614G01027) Eduardo Mosqueira Rey (Coordinador) David Alonso R´ ıos Departamento de Computaci´ on, Facultad de Inform´ atica

Tema 6: Patrones de Diseño Diseño Software (614G01027

Embed Size (px)

Citation preview

Tema 6: Patrones de DisenoDiseno Software (614G01027)

Eduardo Mosqueira Rey (Coordinador)David Alonso Rıos

Departamento de Computacion, Facultad de Informatica

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Indice

1 Introduccion a los Patrones de Diseno

2 Patrones Elementales

3 Disenos Adaptables a los Cambios

4 Patrones y Colecciones de Objetos

5 Disenos Debilmente Acoplados

6 Patrones Creacionales y Otros Principios

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 2

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

DefinicionHistoriaTipos de Patrones

Indice

1 Introduccion a los Patrones de DisenoDefinicionHistoriaTipos de Patrones

2 Patrones Elementales

3 Disenos Adaptables a los Cambios

4 Patrones y Colecciones de Objetos

5 Disenos Debilmente Acoplados

6 Patrones Creacionales y Otros PrincipiosE. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 3

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

DefinicionHistoriaTipos de Patrones

Patrones de diseno

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 4

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

DefinicionHistoriaTipos de Patrones

Patrones de diseno

Patrones de disenoSon soluciones efectivas y reusables a problemas tıpicos de diseno

Efectivas, en el sentido de que ya han resuelto el problema conanterioridad satisfactoriamenteReusables, en el sentido de que pueden aplicarse a un abanico deproblemas de diseno en distintas circunstanciasSu objetivo es crear una coleccion de literatura que ayude a resolverproblemas recurrentes encontrados durante el desarrollo del software

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 5

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

DefinicionHistoriaTipos de Patrones

Historia

1977 - Christopher AlexanderEl termino patron deriva de los trabajos del arquitecto ChristopherAlexander sobre planificacion urbanıstica y arquitectura deedificaciones. Libro: “A Pattern Language”“Un patron es una regla con tres partes que expresa la relacion entreun determinado contexto, un problema y una solucion”

1987 – Ward Cunningham y Kent BeckDecidieron aplicar algunas de las ideas de Alexander para desarrollarun pequeno lenguaje compuesto por cinco patrones que sirviera deguıa para los desarrolladores novatos de Smalltalk.OOPSLA’87: “Using Pattern Languages for Object-OrientedPrograms”

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 6

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

DefinicionHistoriaTipos de Patrones

Historia

1991 – Jim CoplienPublico: “Advanced C++ Programming Styles and Idioms” un librode patrones de programacion en C++

1995 – Gang of Four (GoF)Publicado por Erich Gamma, Richard Helm, Ralph Johnson y JohnVlissides, conocidos habitualmente como la banda de los cuatro(Gang of Four) o simplemente GoFEs la principal referencia sobre patrones de diseno y uno de los librosmas completos sobre el temaNo es un libro introductorio, sino avanzado. Los ejemplos estan enC++ y los diagramas en notacion OMT (bastante parecida al UML)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 7

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

DefinicionHistoriaTipos de Patrones

Tipos de patrones segun el nivel conceptualPatrones arquitectonicos

Expresa una organizacion estructural fundamental del softwareProvee de un conjunto de subsistemas predefinidos especificando susresponsabilidades y relacionesEjemplo: Modelo-Vista-Controlador

Patrones de disenoProvee un esquema para refinar los subsistemas o componentes deun sistema software, y las relaciones existentes entre ellosResuelven un problema general de diseno dentro de un contextoparticular.Ejemplo: La comunicacion entre el modelo y la vista se hace a travesdel patron Observador

IdiomasDescribe como implementar aspectos particulares de componentesutilizando las caracterısticas de un determinado lenguaje.Ejemplo: El patron Observador se implementa en Java haciendo usode las clases Observer y Observable

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 8

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

DefinicionHistoriaTipos de Patrones

Antipatrones

AntipatronesSi los patrones representan practicas correctas existen tambien losantipatrones, que representan lecciones aprendidas en el desarrollo delsoftware

Describen una mala solucion a un determinado problema que nosconduce a una mala situacionEs util ya que nos permite identificar las malas soluciones a tiempo ynos permite apartarnos de ese camino y seguir el camino marcadopor los patrones apropiados para resolver el problemaEjemplo, Antipatron “Clase Dios”: Ocurre cuando casi todo elprocesamiento es monopolizado por una unica clase, actuando lasotras clases como meros repositorios de datos ⇒ Incumpliendo elPrincipio de Responsabilidad Unica

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 9

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

DefinicionHistoriaTipos de Patrones

Tipos de patrones de diseno

Patrones creacionalesTratan sobre como crear instancias de objetos y sobre como hacer losprogramas mas flexibles y generales abstrayendo el proceso decreacion de instanciasEjemplo: Instancia Unica, Metodo Factorıa, etc.

Patrones estructuralesDescriben como las clases y los objetos pueden ser combinados paraformar estructuras mayoresEjemplo: Composicion, Adaptador, etc.

Patrones de comportamientoSon patrones que tratan de forma mas especıfica con aspectosrelacionados con la comunicacion entre objetosEjemplo: Estrategia, Observador, etc.

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 10

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Indice

1 Introduccion a los Patrones de Diseno

2 Patrones ElementalesPrincipio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

3 Disenos Adaptables a los Cambios

4 Patrones y Colecciones de Objetos

5 Disenos Debilmente Acoplados

6 Patrones Creacionales y Otros PrincipiosE. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 11

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Principio “Favorece la inmutabilidad”

Principio “Favorece la inmutabilidad”Debe tenderse a crear clases inmutables siempre que sea posible (unaclase inmutable es aquella en la que, una vez creada una instancia dedicha clase no puede modificarse)

Ventajas:Son objetos simples ya que no pueden cambiar de estado. Paraasegurar que las invariantes se cumplen solo hay que realizar losconstructores correctamente (ej. el radio del cırculo no puede sernegativo)Pueden compartirse abiertamente sin temor a modificaciones:comparar String (inmutable) con Date (mutable)No requieren sincronizacion al usarse en varios hilos de ejecucion deforma concurrenteSirven de bloques de construccion para objetos mas complejos

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 12

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Patron Inmutable

Patron InmutableSe encarga de disenar clases que permiten crear cualquier numero deinstancias pero no permite la posterior modificacion de estas instancias

Elementos: Simplemente una clase que ha tomado precaucionespara evitar que pueda cambiarse su estadoEste patron no aparece incluido en el libro GoF, aunque sı en otroslibros de patrones como el de Grand

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 13

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Reglas para hacer una clase inmutable1 No incluir metodos que modifiquen el estado del objeto

Conocidos como metodos de escritura o mutadores (set...)2 Asegurarse de que los metodos no pueden ser sobrescritos

De esa forma evitaremos que subclases descuidadas o directamentemaliciosas comprometan el comportamiento inmutableLa forma mas facil de hacerlo es definiendo la clase como final

3 Declarar todos los atributos como finalNos fuerza a darle un valor a dichos atributos en el constructor y aque dicho valor no pueda ser modificado (blank finals)

4 Declarar todos los atributos como privadosEvitando que puedan ser modificados directamente y encapsulando laestructura interna del objeto inmutable

5 Evitar el acceso a componentes internos mutablesSi la clase tiene atributos que son objetos mutables entonces hay queasegurarse que ningun cliente de la clase pueda obtener referencias aestos objetos (evitando inicializar estos objetos con referenciasobtenidas del cliente, haciendo copias defensivas, etc.)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 14

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Patron Inmutable

Clase Punto inmutable

public final class Punto {private final int x;private final int y;

public Punto(int x, int y) {this.x = x;this.y = y;

}

public int getX() {return x;

}

public int getY() {return y;

}

public Punto mover(int x, int y) {return new Punto(this.x + x, this.y + y);

}}

Clase definida como final

Atributos privados y finalesinicializados en el constructor

Metodos de lectura queno devuelven referen-

cias a objetos mutables

Metodos que “simulan” alterarel estado del objeto pero que

en realidad devuelven unanueva instancia de dicho objeto

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 15

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Patron Inmutable

InconvenienteUna clase inmutable requiere un objeto distinto por cada posible valorSi es necesario crear muchos de estos valores (por ejemplooperaciones que se llevan a cabo en un bucle) la penalizacion en elrendimiento puede ser considerable.

SolucionDefinir clases mutables asociadas a clases inmutables y que puedanutilizarse para realizar las operaciones que resultan costosas en lasclases inmutablesEstas clases sı permiten cambios en el estado en aquellas operacionesen las que la clase inmutable simulaba alterar el estado del objetoTambien incluyen metodos para crear un objeto mutable a partir desu equivalente inmutable y viceversa

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 16

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Patron Inmutable

Clase PuntoMutable

public class PuntoMutable {private int x;private int y;public int getX() { return x; }public int getY() { return y; }

public PuntoMutable(int x, int y) {this.x = x;this.y = y;

}public PuntoMutable mover(int x, int y) {

this.x += x;this.y += y;return this;

}public PuntoMutable(Punto p) {

this(p.getX(), p.getY());}public Punto getInmutable() {

return new Punto(x, y);} } }

La clase no es final

Los atributos son pri-vados pero no finales

El metodo mover sı quemodifica el estado del objeto

Podemos convertir un puntoinmutable en mutable (atraves de un constructor)y viceversa (a traves del

metodo getInmutable)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 17

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Patron Inmutable

Utilizacion de la clase asociada mutable

public static void main(String[] args) {// Modificacion realizada directamente sobre el objeto inmutablePunto p1 = new Punto(5, 7);for (int i = 1; i < 1000; i++) {

p1 = p1.mover(1, 2); // Se crean mil instancias de Punto}System.out.println(p1.getX() + " " + p1.getY());

// Modificacion realizada utilizando la clase mutable asociadaPunto p2 = new Punto(5, 7);PuntoMutable pm = new PuntoMutable(p2);for (int i = 1; i < 1000; i++) {

pm = pm.mover(1, 2); // No se crean nuevas instancias}p2 = pm.getInmutable();System.out.println(p2.getX() + " " + p2.getY());

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 18

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Patron Inmutable

Ejemplos en el API de JavaLa clase String es inmutable y tiene a StringBuilder comoclase asociada mutableLas clases envoltorio como Integer o Double son inmutables, lostipos basicos (int, double, etc.) actuarıan como sus asociadosmutablesClases como BigDecimal o BigInteger son inmutables. Existenclases asociadas como MutableBigInteger. Curiosamente estasclases no fueron definidas como final lo que se considera un falloen su inmutabilidadEn general todas las clases que actuan como tipos basicos esrecomendable que sean inmutables, la notable excepcion es Date yes uno de los motivos de que en la version 8 de Java se incluya unnuevo API de fechas

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 19

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Instancia Unica

Instancia UnicaSe utiliza para asegurarnos que una clase tiene solo una instancia yproporcionar un punto global de acceso a ella

Serıa algo similar al Type Safe Enum visto en el tema 2 perorestringido a una unica instanciaEjemplo: En un sistema pueden existir muchas impresoras pero solopuede existir una instancia del objeto que representa al gestor deimpresion

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 20

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Elementos del Patron Instancia Unica

Instancia Unica: Clase que tiene un atributo del tipode la propia clase definido como estatico y privado

Un metodo de lecturaestatico nos permite ac-ceder a dicho atributo

El constructor se defineprivado para evitar quese creen mas instancias

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 21

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Patron Instancia Unica

Clase Singleton (inicializacion temprana)

class Singleton {

private static final Singleton instancia = new Singleton();

private Singleton() { }

public static Singleton getInstancia() {return instancia;

}}

La instancia deSingleton se creaal cargar la clase enla maquina virtual

El codigo es thread-safe, todos los hi-los acceden a lamisma instancia

Tiene la sobrecarga de tener una ins-tancia creada aunque nunca se use

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 22

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Patron Instancia Unica

Clase SingletonLazy (inicializacion tardıa)

class SingletonLazy {

private static SingletonLazy instancia = null;

private SingletonLazy() { }

public static SingletonLazy getInstancia() {if (instancia == null) {

instancia = new SingletonLazy();}return instancia;

}}

La instancia deSingletonLazy

se inicializa a nullpara evitar crearlasi no es necesario

La instancia secrea la primera

vez que se llamaa getInstancia

Puede ser problematico si usamos varios hilosde ejecucion (podemos crear una version

mas compleja que incluye sincronizaciones)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 23

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Problemas con el Patron Instancia Unica (1/3)

Varios autores consideran a los singleton un problema mas que unasolucion. Sugieren que pueden ser utiles en algunos contextos peropor lo general habrıa que evitarlosOfrecen un punto global de acceso a un servicio

Eso nos evita tener que andar pasando la referencia al servicio entredistintas clases. El problema es que crea una variable global, que usanmuchas clases de nuestro sistema y que constituye una dependenciaoculta no visible al analizar los interfaces de las clases y los metodos

Promueven el acoplamiento estrecho entre clasesLas clases que usan el singleton estan fuertemente acopladas a laclase del propio singleton. La alternativa de pasar una referencia a unservicio entre distintas clases permite usar polimorfismo para sustituirdicha clase por otra alternativa

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 24

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Problemas con el Patron Instancia Unica (2/3)

Incumplen el principio de responsabilidad unicaUna clase no deberıa saber que es un singleton y deberıa solocentrarse en sus responsabilidades. Si queremos evitar la creacion deinstancias deberıan usarse otro tipo de patrones como son lasfactorıas

Llevan un estado con ellos que dura tanto como la ejecuciondel programa

Los estados persistentes son enemigos de las pruebas unitarias. Laspruebas unitarias requieren que los tests sean independientes y que elorden en que se ejecuten no afecte al resultado. Valores globales yestaticos como son los singleton pueden crear dependenciasindeseadas en los tests

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 25

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Favorece la Inmutabilidad”Patron InmutablePatron Instancia Unica

Problemas con el Patron Instancia Unica (3/3)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 26

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Indice

1 Introduccion a los Patrones de Diseno

2 Patrones Elementales

3 Disenos Adaptables a los CambiosPrincipio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

4 Patrones y Colecciones de Objetos

5 Disenos Debilmente Acoplados

6 Patrones Creacionales y Otros PrincipiosE. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 27

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Principio “Encapsula lo que varıa”

Principio “Encapsula lo que varıa”Identifica los aspectos de tu aplicacion que varıan y separalos de aquellosque permanencen estables

No importa lo bien queeste disenada una aplicacion, con eltiempo una aplicacion debe crecer ycambiar o moriraSeparando las partes susceptibles devariar significa que podemoscambiarlas en el futuro sin afectar aotras partes del codigo

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 28

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Patron Estrategia

Patron EstrategiaPatron de comportamiento que se utiliza para definir una familia dealgoritmos, encapsularlos y hacerlos intercambiables.

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 29

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Elementos del Patron Estrategia

Estrategia: Declara unainterfaz comun para todoslos algoritmos soportados

Estrategia concreta: Implemen-ta el algoritmo utilizando el in-terfaz definido en la Estrategia

Contexto:Delega enel objeto Estrategia elcalculo del algoritmo

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 30

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Estrategia

Tenemos una clase Vector que representa a un vector de enterosAparte de las operaciones propias de un vector queremos que existala posibilidad de ordenarloAlgoritmos de ordenacion existen muchos, y dependiendo delcontexto podemos requerir uno u otroAplicamos Estrategia para separar la parte que varıa (el algoritmode ordenacion) del contexto (el vector) y permitir cambiardinamicamente de algoritmo de ordenacion

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 31

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Estrategia

AlgoritmoOrdenacion:Juega el rol de Estrategia

OrdenacionBurbuja juega elrol de Estrategia concreta

Vector juega el rol de Contexto

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 32

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Patron Estrategia

Clase Vector (vector de enteros)

public class Vector {private List<Integer> datos = new ArrayList<>();

public Vector() { }

public Vector(int valores) {java.util.Random aleatorio = new java.util.Random();for (int i=0; i<valores; i++)

datos.add(aleatorio.nextInt(100));}public void introduceValor(int valor) {

datos.add(valor);}public void introduceValor(int posicion, int valor) {

datos.set(posicion, valor);}public int obtieneValor(int posicion) { return datos.get(posicion); }public int longitud () { return datos.size(); }// ...

Vector usa un ArrayListpara almacenar los datos

Podemos generarlo vacıoo con datos aleatorios

Usamos delegacionpara los metodos

basicos de Vector

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 33

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Patron Estrategia

Clase Vector (vector de enteros)

// ...private AlgoritmoOrdenacion algoritmo;

public AlgoritmoOrdenacion getAlgoritmo() {return algoritmo;

}

public void setAlgoritmo(AlgoritmoOrdenacion algoritmo) {this.algoritmo = algoritmo;

}

public void ordenaVector() {algoritmo.ordena(this);

}}

Favorece la composicionsobre la herencia: Vectorencapsula una instancia deAlgoritmoOrdenacion

Vector delega la or-denacion en el objeto

algoritmo pasandose ası mismo como parametro

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 34

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Patron Estrategia

Clase Vector (vector de enteros)

public interface AlgoritmoOrdenacion {void ordena(Vector vector);

}

public class OrdenacionBurbuja implements AlgoritmoOrdenacion {@Overridepublic void ordena(Vector v) {

int i, j, aux;for (i=0; i < v.longitud()-1; i++)

for (j = 0; j < v.longitud()-i-1; j++)if (v.obtieneValor(j + 1) < v.obtieneValor(j)) {

aux = v.obtieneValor(j + 1);v.introduceValor(j+1, v.obtieneValor(j));v.introduceValor(j, aux);

}}

}

Inversion de la dependencia:Programa sobre interfaces,no sobre implementaciones

Encapsula lo que varıa

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 35

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ventajas del Patron Estrategia

VentajasPermite representar de forma sencilla familias de algoritmosfactorizando sus partes comunes en una misma clase padrePodrıa hacerse realizando subclases del contexto, pero mezclarıamosalgoritmo y contexto complicando su comprension y/o modificacionEvita tener que utilizar multiples sentencias condicionales en elcontexto para elegir el algoritmo adecuado

InconvenientesTodos los algoritmos tienen que compartir un mismo interfaz, lo queen ocasiones obliga a pasar datos innecesarios (algun algoritmorequiere menos datos) sobrecargado la comunicacion entre contextoy algoritmoSi hay muchas alternativas se pueden llegar a crear muchos objetos.Algo que puede solucionarse implementando las estrategias comoobjetos sin estado que puedan compartirse entre distintos contextos

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 36

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Metodo Plantilla

Metodo PlantillaDefine el esqueleto de un algoritmo en una operacion pero difiriendoalguno de los pasos a las subclases

Las subclases pueden cambiar ciertos aspectos del algoritmo, sincambiar su estructura generalDebe su nombre a que utilizarlo es como cubrir una plantilla o unformulario

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 37

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Elementos del Patron Metodo PlantillaClase abstracta: Implementael metodo plantilla que define

el esqueleto del algoritmoy define las operacionesprimitivas que deberan

implementar las subclases

Clase concreta: Implementalas operaciones primitivas

que definen el compor-tamiento especıfico del

algoritmo para esta subclase

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 38

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Metodo Plantilla

ViajeRoma juega el rolde Clase abstracta siendoviajeRoma el metodo

plantilla y dia2 y dia4las operaciones primitivas

RomaAntigua juega el rol deClase concreta implementando

las operaciones primitivas

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 39

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Metodo Plantilla

Clase ViajeRoma (1/2)

public abstract class ViajeRoma {// Metodo plantillapublic final void viajeRoma() {

viajeDeIda();visitarColiseo();dia2(); // Operacion primitivavisitarSanPedro();dia4(); // Operacion primitivavisitarPlazaEspana();viajeDeVuelta();

}

public abstract void dia2();public abstract void dia4();

// ...

El metodo plantilla definela estructura basica de un

viaje a Roma y no se puedesobrescribir (es final)

Alguno de pasos son di-feridos a las subclases

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 40

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Metodo Plantilla

Clase ViajeRoma (2/2)

// ...public void viajeDeIda() {

System.out.println("Viaje de ida...");}

public void visitarColiseo() {System.out.println("Visitando Coliseo");

}

public void visitarSanPedro() {System.out.println("Visitando San Pedro...");

}

public void visitarPlazaEspana() {System.out.println("Visitando Plaza Espana...");

}

public void viajeDeVuelta() {System.out.println("Viaje de vuelta...");

}}

El resto de metodos estanimplementados, aunque pueden

ser sobrescritos por las sub-clases (metodos de enganche)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 41

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Metodo Plantilla

Clase RomaReligiosa

public class RomaReligiosa extends ViajeRoma {@Overridepublic void dia2() {System.out.println("Visitando el Castillo de Sant’Angelo...");

}

@Overridepublic void dia4() {System.out.println("Visitando la Basilica de San Pablo Extramuros");

}

@Overridepublic void visitarPlazaEspana() {System.out.println("Visitando las iglesias de la Piazza del Popolo");

}}

Implementamos lasoperaciones primitivas

Un metodo de enganche puederedefinirse para darle una

implementacion mas adecuada

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 42

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Metodo Plantilla

Clase RomaAntigua

public class RomaAntigua extends ViajeRoma {

@Overridepublic void dia2() {

System.out.println("Visitando el Foro Romano...");}

@Overridepublic void dia4() {

System.out.println("Visitando el Mercado de Trajano");}

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 43

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Patron Metodo Plantilla vs. Patron Estrategia

SimilitudesSe utilizan para implementar distintos tipos de algoritmos similares

DiferenciasEl patron estrategia utiliza la delegacion (el contexto delega en laestrategia) para escoger entre las distintas variantes de un algoritmo(los algoritmos persiguen el mismo objetivo pero pueden sercompletamente diferentes)El patron metodo plantilla utiliza la herencia para variardeterminadas partes de un algoritmo dado (no se puede variar elesquema general del algoritmo)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 44

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Principio de Hollywood

Principio de Hollywood“No nos llame, ya le llamaremos”

El Patron Metodo Plantilla es un buen ejemplo de lo que se conocecomo “El Principio de Hollywood”Consiste en desacoplar elementos de alto nivel y de bajo nivel quepueden trabajar juntosEl elemento de alto nivel mantiene el control y es el encargado dellamar a los elementos de bajo nivel cuando lo considera necesarioUn ejemplo de este principio lo podemos ver en el funcionamiento delos metodos sort del API de colecciones de Java que delegan laparte de comparacion del algoritmo en los metodos compareTo delos propios objetos

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 45

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Patron Estado

Patron EstadoPatron de comportamiento que permite a un objeto modificar suconducta al cambiar su estado interno

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 46

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo

Estados por los que pasa un libro en la biblioteca

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 47

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Implementacion con sentencias condicionales

Clase Libro (1/3)

public class Libro {enum Estado {DISPONIBLE, PRESTADO, RESERVADO};Estado estado = DISPONIBLE;List<String> reservas = new ArrayList<>();String lectorActual;boolean unaSemanaReservado = false;// ...

Definimos los estados comoconstantes dentro de Libro

Libro mantendra unareferencia al estado actualası como otras propiedades

(por simplicidad se han obviadometodos de lectura y escritura)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 48

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Implementacion con sentencias condicionales

Clase Libro (2/3)

public void solicitarPrestamo(String cliente) {if (estado == DISPONIBLE) {

estado = PRESTADO;lectorActual = cliente;System.out.println("Prestando libro a " + cliente);

} else if (estado == PRESTADO) {reservas.add(cliente);System.out.println("Reserva de " + cliente);

} else if (estado == RESERVADO) {if (cliente.equals(reservas.get(0))) {

estado = PRESTADO;lectorActual = cliente;System.out.println("Prestando libro reservado a " + cliente);reservas.remove(0);

} else {reservas.add(cliente);System.out.println("Nueva reserva de " + cliente);

}}

}

Definimos un metodo porcada operacion sobre el libro

Definimos sentencias condicionales paracada estado en el que puede estar el libro

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 49

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Implementacion con sentencias condicionales

Clase Libro (3/3)

public void devolver() {if (estado == PRESTADO) {

if (reservas.isEmpty()) {estado = DISPONIBLE;System.out.println("Libro disponible...");

} else {estado = RESERVADO;System.out.println("Libro en reserva de " + reservas.get(0));

}} else if (estado == RESERVADO) {

if (unaSemanaReservado) {reservas.remove(0);unaSemanaReservado = false;System.out.println("Caduca la reserva");if (reservas.isEmpty()) {

estado = DISPONIBLE;System.out.println("Libro disponible...");

} else {System.out.println("Libro reservado a " + reservas.get(0));

}} } }

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 50

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Implementacion con sentencias condicionales

Ventajas:Es una solucion sencilla y compacta (todo el comportamiento seencapsula en una unica clase)Es la solucion preferida si el numero de estados es pequeno, elnumero de metodos afectados por el estado son pocos y ambos sonestables (no variaran en el futuro)

Inconvenientes:Solucion confusa: demasiadas sentencias condicionales complican sulectura, es complejo saber el funcionamiento de un estado concretoPoco adaptable a cambios: cualquier cambio en los estados ometodos obliga a cambiar la clase Libro incumpliendo principioscomo el Abierto-CerradoPoco cohesiva: Libro tiene demasiadas responsabilidadesentremezcladas (recordemos el Principio de Responsabilidad Unica)Solucion ⇒ Patron Estado

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 51

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Elementos del Patron Estado

Estado: Clase abstractaque encapsula el

comportamiento de losestados del contexto

Estado concreto: Implementael comportamiento asociadocon un estado del contexto

Contexto: Mantiene una instancia deun estado concreto y delega en ella el

funcionamiento dependiente del estado

¿De que me suenaesta estructura?

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 52

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Estado

EstadoLibro juegael rol de Estado

Reservado juega el rolde Estado concreto

Libro juega el rol de Contexto

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 53

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Estado

Clase Libro (Patron Estado)

public class Libro {EstadoLibro estado = Disponible.getInstancia();List<String> reservas = new ArrayList<>();String lectorActual;boolean unaSemanaReservado = false;

public void solicitarPrestamo(String cliente) {estado.solicitarPrestamo(this, cliente);

}public void devolver() {

estado.devolver(this);}

public EstadoLibro getEstado() {return estado;

}public void setEstado(EstadoLibro estado) {

this.estado = estado;}

}

Libro delega el funcionamien-to de solicitarPrestamo

y devolver en el estado

Libro ofrece meto-dos para leer y modi-ficar su estado interno

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 54

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Estado

Clase EstadoLibro

public interface EstadoLibro {void solicitarPrestamo(Libro l, String cliente);void devolver(Libro l);

}

EstadoLibro es un in-terfaz que recoge todoslos metodos que se venafectados por el estado

Libro se pasa a si mismocomo parametro para que losestados puedan manipularlo

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 55

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Estado

Clase Disponible

public class Disponible implements EstadoLibro {private static final Disponible instancia = new Disponible();private Disponible() { }public static Disponible getInstancia() { return instancia; }

@Overridepublic void solicitarPrestamo(Libro l, String cliente) {

l.setEstado(Prestado.getInstancia());l.lectorActual = cliente;System.out.println("Prestando libro a " + cliente);

}

@Overridepublic void devolver(Libro l) {

// Un libro disponible no se puede devolver}

}

Definimos los estados comosingletons para poderlos

compartir entre distintos libros

Cada posible estado se implementa comouna clase implementadora de EstadoLibro

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 56

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Estado

Clase Prestado

public class Prestado implements EstadoLibro {private static final Prestado instancia = new Prestado();private Prestado() { }public static Prestado getInstancia() { return instancia; }

@Overridepublic void solicitarPrestamo(Libro l, String cliente) {

l.reservas.add(cliente);System.out.println("Reserva de " + cliente);

}@Overridepublic void devolver(Libro l) {

if (l.reservas.isEmpty()) {l.estado = Disponible.getInstancia();System.out.println("Libro disponible...");

} else {l.estado = Reservado.getInstancia();System.out.println("Libro en reserva de " + l.reservas.get(0));

}}

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 57

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Ejemplo del Patron Estado

Secuencia al prestar un libro disponible

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 58

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio “Encapsula lo que Varıa”Patron EstrategiaPatron Metodo PlantillaPrincipio de HollywoodPatron Estado

Patron Estado

Ventajas del patron estado:Localiza y separa el comportamiento especıfico de cada estadoPermite anadir nuevos estados de forma sencilla, simplementeanadiendo nuevas clasesLas transiciones entre estados y el comportamiento de los mismos esmas claroLos objetos que representan a los estados pueden compartirse,siempre y cuando no incluyan informacion en variables de instancia

Inconveniente:El codigo es menos compacto que la solucion basada en sentenciascondicionales

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 59

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Indice

1 Introduccion a los Patrones de Diseno

2 Patrones Elementales

3 Disenos Adaptables a los Cambios

4 Patrones y Colecciones de ObjetosPatron ComposicionPatron Iterador

5 Disenos Debilmente Acoplados

6 Patrones Creacionales y Otros Principios

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 60

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Patron Composicion

Patron ComposicionEs un patron estructural que se utiliza para componer objetos enestructuras de arbol que representan jerarquıas todo-parte

Este patron permite tratar uniformemente a los objetos y a lascomposicionesEs un buen ejemplo de utilizacion conjunta de herencia ycomposicion

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 61

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Elementos del Patron Composicion

Componente: Declara lainterfaz para los obje-tos en la composicion

Composicion: Define elcomportamiento de los

objetos compuestos (puedencontener otros objetos)

Componente concreto:Defineel comportamiento de los

objetos elementales dela composicion (aquellos

que no pueden tener hijos)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 62

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron ComposicionSistemaDeFicheros juega elrol de Componente siendotamano() la operacion que

se delega a las subclases

Directorio juega elrol de Composicion

Fichero juega el rol deComponente concreto

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 63

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron Composicion

Clase SistemaDeFicheros

public abstract class SistemaDeFicheros {private String nombre;

public SistemaDeFicheros(String nombre) {this.nombre = nombre;

}

public String getNombre() {return nombre;

}

public void setNombre(String nombre) {this.nombre = nombre;

}

public abstract int tamano();}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 64

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron Composicion

Clase Fichero

public class Fichero extends SistemaDeFicheros {private int numBytes;

public Fichero(String nombre, int bytes) {super(nombre);numBytes = bytes;

}

public void setNumBytes(int numBytes) { this.numBytes = numBytes; }public int getNumBytes() { return numBytes; }

@Overridepublic int tamano() {

return numBytes;}

}Calcular el tamano de un

fichero es simplementedevolver su numero de bytes

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 65

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron Composicion

Clase Directorio

public class Directorio extends SistemaDeFicheros {private List<SistemaDeFicheros> elementos = new ArrayList<>();

public Directorio(String nombre) { super(nombre); }public void insertar(SistemaDeFicheros sdf) { elementos.add(sdf); }public void eliminar(SistemaDeFicheros sdf) { elementos.remove(sdf); }public SistemaDeFicheros getElemento(int i){ return elementos.get(i);}

@Overridepublic int tamano() {

int suma = 0;for(SistemaDeFicheros sdf : elementos)

suma += sdf.tamano();return suma;

}}

El directorio incluye metodos pa-ra insertar y borrar nuevos elementos

Calcular el tamano de un directorio consisteen sumar el tamano de sus elementos (si

estos son directorios la operacion se repite)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 66

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Elementos del Patron Composicion Compleja

ComposicionAbstracta: Clase comun a todaslas composiciones que define el comporta-

miento basico de anadir/eliminar componentes

ComposicionConcreta:Ahora puede haber varios

tipos de composiciones

Componente concreto:Tambien puede

haber varios tiposde componentes

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 67

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron Composicion Compleja

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 68

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Patron Composicion

Ventajas:Permite tratar a los objetos basicos y a los objetos compuestos demanera uniforme, facilitando la introduccion de nuevos componentes

Inconvenientes:Si queremos restringir que componentes concretos pueden ir en unadeterminada composicion es necesario anadir comprobaciones entiempo de ejecucion

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 69

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Patron Composicion

Operaciones para insertar hijos en una composicionLo normal serıa situarlas en la clase Composicion (que es dondetienen sentido) ⇒ obligarıa a saber que nuestro Componente esuna ComposicionPodrıamos subir estas operaciones a Componente para tratar a losobjetos ComponenteConcreto y Composicion de formagenerica ⇒ puede llevar a situaciones problematicas al tratar deanadir componentes a los componentes concretosSe trata de un equilibrio entre la seguridad de tener los metodos enel sitio correcto de la jerarquıa y la transparencia que permitetrabajar con composiciones y componentes concretos sin saberrealmente con cual estamos trabajando

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 70

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Patron Iterador

Patron IteradorProporciona un modo de acceder secuencialmente a los elementos de unobjeto agregado (coleccion de objetos) sin exponer su representacioninterna

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 71

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Elementos del Patron IteradorAgregado: Define una interfazpara crear un objeto Iterador

Agregado concreto: Representaal objeto agregado que man-

tiene una coleccion de objetosy que puede crear iteradores

Iterador: Define una in-terfaz para recorrer los

elementos y acceder a ellos

Iterador concreto: Imple-menta el interfaz Iterador y

permite el recorrido del objetoagregado manteniendo laposicion actual del mismo

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 72

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron IteradorEl Patron Iterador en Java

Interfaz Iterable juega el rol de Agregado y define un metodoiterator que devuelve una instancia del iteradorInterfaz Iterator juega el rol de iterador y define tres metodos:

hasNext(): boolean: Indica si aun quedan elementos por recorrer(equivale a heTerminado())next(): Object: Devuelve siguiente elemento en la iteracion (serıauna combinacion de inicio(), siguiente() e itemActual())remove(): Elimina de la coleccion el ultimo elemento devuelto porel iterador (desde Java 8 tiene una implementacion por defecto quelanza una excepcion y no es obligatorio sobrescribirlo)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 73

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron Iterador

Pila representa una pila de enteros yjuega el rol de Agregado concreto,

la coleccion que queremos iterar

Iterador pila juega el rol deIterador concreto recorriendo

la pila de forma secuencial

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 74

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron Iterador

Clase Pila

public class Pila implements Iterable {private int[] datos;private int cima = -1;

public Pila(int maxValores) { datos = new int[maxValores]; }public void push(int valor) { datos[++cima] = valor; }public int peek() { return datos[cima]; }public int pop() { return datos[cima--]; }

@Overridepublic Iterator iterator() {

return new IteradorPila(datos, cima);}

}

Planteamos una pila sencillasin preocuparnos de las

posibles excepciones (sacarde una pila vacıa, etc.)

Lo habitual es pasar el objeto actual comoparametro al constructor del iterador, comoel interfaz de la pila solo permite acceder ala cima debemos pasar su estructura interna

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 75

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Ejemplo del Patron Iterador

Clase IteradorPila

class IteradorPila implements Iterator {private final int[] datos;private int cursor = 0; // Proxima posicion a leerprivate int cima; // Posicion de la cima

public IteradorPila(int[] datos, int cima) {this.datos = datos;this.cima = cima;

}

@Overridepublic boolean hasNext() { return cursor <= cima; }

@Overridepublic Object next() { return datos[cursor++]; }

@Overridepublic void remove() { throw new UnsupportedOperationException(); }

}

El iterador reci-be la estructura

interna de la pila

Y la recorre usando los metodos de Iterator

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 76

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Iteradores como clases internas

El hecho de que el iterador de la pila sea una clase distinta de la pilaes una ventaja: las responsabilidades estan separadas de forma masclara, podemos tener varios iteradores recorriendo la estructura deforma simultanea, etc.El problema viene porque el interfaz de la pila no permite surecorrido secuencial, por lo que debemos pasar su estructura internacomo parametro al iteradorSolucion ⇒ Definir el iterador como una clase interna de Pila

Una instancia de una clase interna esta asociada a una instancia desu clase contenedoraAdemas tendra acceso a todos los elementos de la clase contenedora(incluso los privados)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 77

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Iteradores como clases internas

Clase IteradorPila como clase interna de Pila

public class Pila implements Iterable {private int[] datos;private int cima = -1;public Pila(int maxValores) { datos = new int[maxValores]; }public void push(int valor) { datos[++cima] = valor; }public int peek() { return datos[cima]; }public int pop() { return datos[cima--]; }@Overridepublic Iterator iterator(){ return new IterablePila(); }class IterablePila implements Iterator {

private int cursor = 0;@Overridepublic boolean hasNext() { return cursor <= cima; }@Overridepublic Object next() { return datos[cursor++]; }@Overridepublic void remove() { throw new UnsupportedOperationException();}

}}

IterablePila es unaclase interna de Pila yaccede directamente asus elementos privados

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 78

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Iteradores como clases internas

Representacion en UMLde una clase interna

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 79

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Iteradores como clases internas

Java basa el funcionamiento delbucle for-each en las clasesIterable e IteratorCualquier clase como Pila queimplemente Iterable puede serrecorrida mediante un buclefor-each

Bucles for-each e iteradores

public static void main(String[] args) {Pila p = new Pila(10);p.push(2);p.push(4);p.push(6);p.push(8);for (Object o : p) {

System.out.print(o + " ");} // Imprime 2 4 6 8

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 80

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron ComposicionPatron Iterador

Patron Iterador

VentajasSe puede acceder al contenido del objeto agregado sin exponer surepresentacion internaPermite implementar varios recorridos distintos sobre objetosagregadosProporciona una interfaz uniforme para recorrer diferentesestructuras agregadas

InconvenientesLa modificacion del agregado mientras se esta recorriendo con uniterador es una operacion peligrosa.Una posible y compleja solucion es disenar iteradores “robustos” quese adapten a estas modificaciones.Una solucion mas sencilla, aunque mas drastica, es disenar iteradoresfail-fast que lanzan un error si se produce una modificacion durantela iteracion (los iteradores del API de Java son fail-fast)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 81

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Indice

1 Introduccion a los Patrones de Diseno

2 Patrones Elementales

3 Disenos Adaptables a los Cambios

4 Patrones y Colecciones de Objetos

5 Disenos Debilmente AcopladosPrincipio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

6 Patrones Creacionales y Otros PrincipiosE. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 82

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de “Bajo Acoplamiento”

Principio de “Bajo Acoplamiento”Busca disenos debilmente acoplados entre objetos que interactuan

AcoplamientoMedida de la dependencia que tiene una determinada clase de otrasclases del sistema

Un codigo con bajo acoplamiento es un codigo mas robusto yadaptable, ya que los cambios en una clase no se propagan al restode clases del sistema, solo a unas pocas clases cercanas

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 83

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de “Bajo Acoplamiento”

Como reducir el acoplamiento:Haciendo que nuestra clase trabaje sobre objetos abstractos y noconcretos, haciendolos menos dependientes de una implementacionconcreta ⇒ Inversion de la DependenciaConectando a las clases con el menor numero posible de otras clases,usando clases que juegan el rol de intermediarias entre otras clasesdel sistema ⇒ Principio de Mınimo Conocimiento

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 84

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de “Bajo Acoplamiento”

Acoplamiento y CohesionEl objetivo es crear objetos cohesivos (centrados en resolver unaunica responsabilidad) con bajo acoplamiento (dependientes delmenor numero posible de clases)

Acoplamiento y clases inestablesEl acoplamiento alto es un problema cuando alguna de las clases esinestable y cambia frecuentemente, ya que eso provoca cambios enlos elementos dependientesSi las clases acopladas son estables, desacoplarlas lo unico que hacees anadir complejidad al sistema

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 85

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Patron Observador

Patron ObservadorPermite definir una dependencia “uno a muchos” entre objetos de talforma que, cuando el objeto cambie de estado, todos sus objetosdependientes sean notificados y actualizados automaticamente

El patron desacopla al objeto observado de sus observadores, ya queel primero desconoce la clase a la que pertenecen los ultimos, solosabe que implementan un determinado interfazSe pueden anadir observadores en cualquier momento y no esnecesario modificar el subjeto observado al anadir nuevos tipos deobservadoresDe la misma forma cambios en el objeto observado no deberıanafectar a sus observadores

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 86

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Elementos del Patron Observador Observador: Clase abstrac-ta que define un metodoactualizar utilizado

por el sujeto para notifi-car cambios en su estado

Observador concre-to: Mantiene una

referencia al sujetoconcreto e imple-

menta actualizar

Sujeto: Clase abstractaque esta siendo observa-da y que proporciona lainterfaz para mantener y

notificar a los observadores

Sujeto concreto: Mantiene elestado del sujeto y se encarga

de notificar a los observa-dores al cambiar su estado

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 87

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Funcionamiento del Patron Observador

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 88

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Funcionamiento del Patron Observador

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 89

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

El Patron Observador en Java

El patron Observador puede ser implementando de forma sencilla enJava haciendo uso de las clases Observable y Observerdisponibles en el APIObservable juega el rol de Sujeto mientras que Observerjuega el rol de ObservadorSon clases muy simples y el patron puede implementarse de formasencilla sin tener que usarlasUn ejemplo mas complejo del patron Observador lo encontramos enel mecanismo de delegacion de eventos usado en los interfacesgraficos Swing

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 90

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

El Patron Observador en Java

Interface Observer

public interface Observer {void update(Observable o, Object arg);

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 91

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

El Patron Observador en Java

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 92

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

El Patron Observador en Java

Clase Observable (1/2)

public class Observable {private boolean changed = false;private Vector obs;public Observable() { obs = new Vector(); }

public synchronized void addObserver(Observer o) {if (o == null) throw new NullPointerException();if (!obs.contains(o)) { obs.addElement(o); }

}public synchronized void deleteObserver(Observer o) {

obs.removeElement(o);}public synchronized void deleteObservers() {

obs.removeAllElements();}public synchronized int countObservers() {

return obs.size();}// ...

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 93

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

El Patron Observador en Java

Clase Observable (2/2)

// ...protected synchronized void setChanged() { changed = true; }protected synchronized void clearChanged() { changed = false; }public synchronized boolean hasChanged() { return changed; }

public void notifyObservers() { notifyObservers(null); }

public void notifyObservers(Object arg) {Object[] arrLocal;

synchronized (this) {if (!changed) return;arrLocal = obs.toArray();clearChanged();

}for (int i = arrLocal.length-1; i>=0; i--)

((Observer)arrLocal[i]).update(this, arg);}

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 94

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Observador

Observer juega elrol de Observador

AlarmaPiscinajuega el rol de Ob-servador concreto

Observable juegael rol de Sujeto

Piscina juega el rolde Sujeto concreto

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 95

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Observador

Clase Piscina

class Piscina extends Observable {public static final int MAX = 100;public static final int MIN = 50;public enum Limite{NIVEL_MAX, NIVEL_MIN}private int nivel;public Piscina(int valor) { nivel = valor; }public int getNivel() { return nivel; }

public void abreGrifo(int incremento) {nivel += incremento;if (nivel > MAX) {

setChanged();notifyObservers(Limite.NIVEL_MAX);

}}public void quitaTapon(int decremento) {

nivel -= decremento;if (nivel < MIN) {

setChanged();notifyObservers(Limite.NIVEL_MIN);

} } }

Cuando el nivel superael maximo o baja

del mınimo se avisaa los observadores

indicandoles el eventoque ha sucedido

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 96

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Observador

Clase AlarmaPiscina

class AlarmaPiscina implements Observer {@Overridepublic void update(Observable o, Object arg) {

Piscina p = (Piscina)o;int cantidad;

System.out.println("El nivel de la piscina es: " + p.getNivel());if (arg.equals(Piscina.Limite.NIVEL_MAX)) {

cantidad = Piscina.MAX - p.getNivel();System.out.println("Hay que VACIAR la cantidad de "+cantidad);

} else if (arg.equals(Piscina.Limite.NIVEL_MIN)) {cantidad = Piscina.MIN - p.getNivel();System.out.println("Hay que LLENAR la cantidad de "+cantidad);

}}

}

La claseAlarmaPiscina

comprueba que eventorecibe y accede al

estado de Piscinapara calcular la can-tidad que necesita

para restaurar el nivel

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 97

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Observador

Uso de Piscina y AlarmaPiscina

public static void main(String[] args) {Piscina casaDelAgua = new Piscina(75);AlarmaPiscina alarmaSocorrista = new AlarmaPiscina();AlarmaPiscina alarmaBomberos = new AlarmaPiscina();

casaDelAgua.addObserver(alarmaSocorrista);casaDelAgua.addObserver(alarmaBomberos);

System.out.println("Nivel de la piscina: " + casaDelAgua.getNivel());casaDelAgua.abreGrifo(10);System.out.println("Nivel de la piscina: " + casaDelAgua.getNivel());casaDelAgua.abreGrifo(30);System.out.println("Nivel de la piscina: " + casaDelAgua.getNivel());casaDelAgua.quitaTapon(100);

}

Registramos dos obser-vadores de la piscina

Al modificar el nivel delegamos enla piscina el avisar a sus observa-

dores si ocurre un evento resenable

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 98

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ventajas e inconvenientes del Patron Observador

VentajasAl desacoplar los observadores de la clase observable, esta ultima notiene por que conocer la clase concreta a la que pertenecen susobservadores, simplemente se limita a notificar los cambios a travesde un interfaz conocidoLa responsabilidad del objeto observado se acaba con la notificacion,son los observadores los que tienen que decidir que accion llevar acabo despues de la notificacion

InconvenientesLos observadores no tienen contacto entre si, esto puede dar lugar asituaciones difıciles de controlar cuando varios observadoresresponden simultaneamente ante un cambio. En el peor de los casospuede dar lugar a una cascada de actualizacionesLa comunicacion entre observado y observadores suele ser simple, loque fuerza a los observadores a deducir que ha cambiado en elobservado ⇒ pull model vs. push model

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 99

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Modelo pull vs. modelo push

Modelo pullLos observadores “tiran” del sujetoEl sujeto manda a los observadores una mınima notificacionindicando que su estado ha cambiadoEs responsabilidad de los observadores descubrir que ha cambiado yactuar en consecuenciaVentaja: Enfatiza la ignorancia que tiene el sujeto observado de susobservadoresInconveniente: Puede ser ineficiente, ya que las clases observadorastienen la sobrecarga de descubrir que ha cambiado sin la ayuda delsujeto

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 100

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Modelo pull vs. modelo push

Notificacion pull

public void abreGrifo(int incremento) {nivel += incremento;if (nivel > MAX) {

setChanged();notifyObservers();

}}

Se manda a los observadoressimplemente una notificacion

de que ha sucedido un cambio,es responsabilidad suya

descubrir que ha cambiado

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 101

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Modelo pull vs. modelo push

Modelo pushEl sujeto “empuja” a los observadoresEl sujeto manda a los observadores informacion detallada acerca delo que ha cambiadoImplica que el sujeto tiene un cierto conocimiento sobre lasnecesidades de los observadoresVentaja: La comunicacion puede ser mas eficiente ya que no sefuerza a descubrir a los observadores que es lo que ha cambiadoInconveniente: Sujeto y observadores no son tan independientescomo en el modelo pull

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 102

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Modelo pull vs. modelo push

Notificacion push

public void abreGrifo(int incremento) {nivel += incremento;if (nivel > MAX) {

setChanged();notifyObservers(new Notificacion(nivel,

Notificacion.Limite.NIVEL_MAX));}

}

Se manda a los observado-res informacion detallada de

lo que ha sucedido, estospodran actuar en conse-cuencia sin necesidad de

acceder al estado de Piscina

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 103

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Patron Adaptador

Patron AdaptadorConvierte el interfaz de una clase en otro interfaz que es el esperado porlos clientes. De esta forma permite que cooperen clases con interfacesincompatibles

El patron asume que no se pueden hacer cambios ni en el interfazque esperan los clientes ni en el interfaz que provee la clase servidoraPuede ser debido a que es un API externo, son clases de las cualesno disponemos el codigo fuente o simplemente no se quieremodificar las clases para un determinado uso concreto y puntual

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 104

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Patron Adaptador

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 105

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Patron Adaptador

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 106

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Patron Adaptador

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 107

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Elementos del Patron Adaptador (Herencia multiple)Objetivo: Interfaz

que utiliza el cliente

Cliente: Colabora conotros objetos usandoel interfaz Objetivo

Adaptado:Define una

interfazexistente quenecesita ser

adaptada

Adaptador: Implementa el inter-faz Objetivo convirtiendolo en

el interfaz del adaptado del cualhereda ⇒ Herencia multiple

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 108

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Elementos del Patron Adaptador (Composicion)

Adaptador: Implementa el inter-faz Objetivo convirtiendolo en elinterfaz del adaptado que forma

parte de su estado ⇒ Composicion

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 109

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Diferencias entre Herencia Multiple y Composicion

Herencia Multiple (adaptador de clases)Solo permite adaptar a una clase, no a sus subclasesPermite que el adaptador sobreescriba parte de la conducta deladaptado (ya que es una subclase)Nos evitamos la indireccion que se produce en la composicionEn Java solo es posible realizarla si Objetivo es un interfaz y nouna clase abstracta

Composicion (adaptador de objetos)Permite que un unico adaptador trabaje sobre muchos adaptados(una clase y sus subclases)Introduce un nivel mas de indireccionComplica la sobreescritura de la conducta del adaptado (se necesitacrear una subclase del adaptado y que el adaptador se refiera a estasubclase)Objetivo puede ser una clase abstracta y no un interfaz

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 110

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Adaptador

El API de Java define una clase Stack para implementar elcomportamiento de una pilaStack hereda de Vector (lo que hemos comentado que es unerror) e incluye los tıpicos metodos pop, push y peekEl nuevo API de colecciones de Java incluyo el interfaz Queue paradefinir el funcionamiento de colas. La cola no tiene que serextrictamente una cola FIFO (First In, First Out), ya que puedendefinirse colas de prioridad o incluso una pila LIFO (Last In, FirstOut)Si tenemos un cliente que usa un Queue pero le queremos pasar unobjeto de tipo Stack, al ser sus interfaces incompatibles (y serclases del API que no podemos modificar) necesitamos un adaptador

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 111

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Adaptador

Metodos de Queue

Metodos de Stack

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 112

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Adaptador (Herencia Multiple)

ClienteObjetivo Adaptado

Adaptador

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 113

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Adaptador (Herencia Multiple)

Clase AdaptadorHerencia

public class AdaptadorHerencia extends Stack implements Queue {@Overridepublic boolean offer(Object e) {

push(e);return true;

}

@Overridepublic Object peek() {

if (empty()) return null;else return super.peek();

}

@Overridepublic Object poll() {

if (empty()) return null;else return pop();

}// Resto de metodos de Queue y Collection...

}

AdaptadorHerenciahereda del adaptado e im-

plementa el interfaz objetivo

El adaptador convierte lasllamadas al interfaz Queue

en llamadas a la clase Stackrealizando pequenos ajustes

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 114

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Adaptador (Composicion)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 115

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Adaptador (Composicion)

Clase AdaptadorComposicion

public class AdaptadorComposicion implements Queue {private Stack stack = new Stack();

@Overridepublic boolean offer(Object e) {

stack.push(e);return true;

}@Overridepublic Object peek() {

if (stack.empty()) return null;else return stack.peek();

}@Overridepublic Object poll() {

if (stack.empty()) return null;else return stack.pop();

}// Resto de metodos de Queue y Collection...

}

AdaptadorComposicion im-plementa el interfaz objetivo eincluye un atributo privado quees una instancia del adaptado

El adaptador ahora dele-ga las llamadas al inter-faz Queue en su objetointerno de tipo Stack

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 116

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Adaptador

Clase ClienteQueue

public class ClienteQueue {public static void usandoQueue(Queue q) {

q.offer("A");q.offer("B");q.offer("C");System.out.println(q.poll() + " " + q.poll() + " " + q.poll());

// Imprime C B ASystem.out.println(q.peek());// Imprime el objeto que ya estaba en

} // "q" on "null" si no habıa ninguno

public static void main(String[] args) {AdaptadorHerencia adaptadorH = new AdaptadorHerencia();ClienteQueue.usandoQueue(adaptadorH);

AdaptadorComposicion adaptadorC = new AdaptadorComposicion();ClienteQueue.usandoQueue(adaptadorC);

}}

ClienteQueue esperaun objeto de tipo Queue

Le pasamos un objeto deltipo del adaptador para quepueda trabajar con Stackcomo si fuera un Queue

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 117

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo en el API de Java (Wrapper classes)

Clase Integer

public final class Integer extends Number {private int value;

public Integer(int value) {this.value = value;

}

public int intValue() {return value;

}

// El resto se omite...}

El adaptador implementael interfaz objetivo, que ennuestro caso es Object.

Nuestro cliente sera p.ej. unArrayList que solo almacena

objetos, no tipos basicos

El adaptador mantiene unainstancia interna del adaptado,

en nuestro caso un int

Las operaciones se rediri-gen al adaptado, en este

caso delvolver el valor

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 118

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

Patrones como Observador y Adaptador tratan de reducir elacoplamiento entre dos clases que tienen que colaborar haciendo quese comuniquen a traves de interfaces o clases adaptadorasOtra forma de reducir el acoplamiento es reduciendo el numero deconexiones existentes entre objetos ⇒ Principio de MınimoConocimiento, Principio “Tell, Don’t Ask”, Patron Fachada

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 119

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

Clase Monedero

public class Monedero {private int valor;

public int obtenSaldo() {return valor;

}

public void insertaDinero(int deposito) {valor += deposito;

}

public int obtenDinero(int debito) {if (debito > valor)

debito = valor;valor -= debito;return debito;

}}

Clase Cliente

public class Cliente {private String nombre;private Monedero monedero;

public Cliente(String n, Monedero m) {this.nombre = n;this.monedero = m;

}

public String getNombre() {return nombre;

}

public Monedero getMonedero() {return monedero;

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 120

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

¿Que problema tiene el siguiente codigo?

Clase Repartidor

public class Repartidor {public void obtenerPago(Cliente cliente, int pago) {

Monedero m = cliente.getMonedero();int cantidadPagada = m.obtenDinero(pago);

if (cantidadPagada >= pago)System.out.println("Gracias");

elseSystem.out.println("Volvere mas tarde");

}}

“Nunca hables con extranos... y mucho menos les des tu monedero”

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 121

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

Principio de Mınimo Conocimiento (Ley de Demeter)“No hables con extranos... habla solo con tus amigos inmediatos”

El objetivo de este principio es reducir las interacciones entre objetoshaciendo que “hablen” solo con otros pocos objetos cercanosDe esta forma se reduce el acoplamiento (numero de clases con lasque esta conectada otra clase)El nombre de “Ley de Demeter” viene del proyecto del cual surgio elprincipio

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 122

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

Principio de Mınimo Conocimiento (en la Orientacion a Objetos)Dentro de un metodo de un determinado objeto solo se pueden mandarmensajes a:

El propio objeto (this)Un parametro del metodoUn atributo del propio objetoUn elemento de una coleccion que es un atributo del propio objetoUn objeto creado dentro del metodo

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 123

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

Clase que cumple el principio

public class ClaseA {private ClaseC cc;private List<ClaseD> coleccion = new ArrayList<>();

public void metodoA1 (ClaseB cb) {this.metodoA2(); // Llamada a un metodo del propio objetocb.metodoB(); // Llamada a un metodo de un paremetrocc.metodoC(); // Llamada a un metodo de un atributocoleccion.get(0).metodoD(); // Llamada a un metodo de un elemento de

// una coleccion que es un atributoClaseE ce = new ClaseE();ce.metodoE(); // Llamada a un metodo de un objeto creado

}

public void metodoA2() { }}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 124

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

Repartidor no cumple el principio al llamar a un metodo(obtenDinero) de un objeto (m), que no es un atributo,parametro, ni se ha creado en el metodo obtenerPago

Repartidor no cumple el principio

public class Repartidor {public void obtenerPago(Cliente cliente, int pago) {

Monedero m = cliente.getMonedero();int cantidadPagada = m.obtenDinero(pago);

if (cantidadPagada >= pago)System.out.println("Gracias");

elseSystem.out.println("Volvere mas tarde");

}}

Incumple la Leyde Demeter

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 125

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

Clase Cliente

public class Cliente {private String nombre;private Monedero monedero;

public Cliente(String nombre, Monedero monedero) {this.nombre = nombre;this.monedero = monedero;

}

public String getNombre() {return nombre;

}

// public Monedero getMonedero() {// return monedero;// }

public int obtenPago(int pago) {return monedero.obtenDinero(pago);

}}

Eliminamos el meto-do getMonedero()

Incluimos un nuevo metodopara gestionar los pagos

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 126

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

Clase Repartidor

public class Repartidor {public void obtenerPago(Cliente cliente, int pago) {int cantidadPagada = cliente.obtenPago(pago);

if (cantidadPagada >= pago)System.out.println("Gracias");

elseSystem.out.println("Volvere mas tarde");

}}

El Repartidor solo interactuacon Cliente y desconocela existencia de Monedero

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 127

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

VentajasEl acoplamiento entre clases es mas bajo con la nueva solucionRepartidor no se ve afectado por los cambios que puedanproducirse en MonederoSituamos el mecanismo de pago en Cliente haciendo queRepartidor solo conozca el resultado final pero no el mecanismo(podemos ir al monedero o pedir dinero prestado al vecino)Existe un reparto mas claro de responsabilidades entre las distintasclases

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 128

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio de Mınimo Conocimiento (Ley de Demeter)

InconvenientesCliente se vuelve mas complejo al tener que incluir un nuevometodo (obtenPago), aunque a cambio hemos simplificado elfuncionamiento de RepartidorSi Cliente tuviera que repetir la misma operacion para otras clases(me piden un pago por tarjeta, me solicitan el numero de DNI)podrıa llegar a complicarse bastante

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 129

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio “Tell, Don’t Ask” (Dile, No preguntes)

Principio “Tell, Don’t Ask” (Dile, No preguntes)Hay que decirle a los objetos lo que quieres que hagan, no preguntarlesacerca de su estado interno y tomar una decision en base a su respuesta

Preguntarle a un objeto por su estado y luego llamar a metodossobre ese objeto basandose en decisiones tomadas fuera de eseobjeto, significa que ese objeto es una leaky abstraction (abstraccioncon fugas)Parte del comportamiento del objeto se situa fuera del mismo y suestructura interna se expone (puede que innecesariamente) al mundoexterior

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 130

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio “Tell, Don’t Ask” (Dile, No preguntes)

Este principio es similar a la Ley deDemeter, en el sentido en que ambosproponen reducir el acoplamiento entreobjetosSin embargo el principio “Tell, Don’t Ask”es mas general ya que intenta hacerrecordar que la orientacion a objetos tratade la encapsulacion conjunta de datos conlas funciones que operan sobre esos datos

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 131

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio “Tell, Don’t Ask” - EjemploNumero racional: numero que puede representarse como elcociente de dos numeros enteros

Clase Racional

public class Racional {private int numerador;private int denominador;

public Racional(int numerador, int denominador) {if (denominador == 0)

throw new IllegalArgumentException();this.numerador = numerador;this.denominador = denominador;

}

public int getNumerador() { return numerador; }public int getDenominador() { return denominador; }

// ...}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 132

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio “Tell, Don’t Ask” - Ejemplo

Suponemos que dentro del codigo de otra clase (UsaRacional)queremos comprobar si un racional es igual a un valor dado (porejemplo 1/2)

Clase UsaRacional

public class UsaRacional {public static void main(String[] args) {

Racional r1;

// ...

if (r1.getNumerador() == 1 && r1.getDenominador() == 2)System.out.println("Tienes la mitad de la tarta...");

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 133

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio “Tell, Don’t Ask” - Ejemplo

ProblemasUsaRacional esta examinando el estado interno de Racionalpara tomar una decision.Estamos exponiendo innecesariamente la estructura interna deRacionalEstamos situando comportamiento propio de Racional fuera delmismo ⇒ la comparacion de dos valores racionales

SolucionDefinir un metodo equals en Racional que se encargue de hacerlas comparacionesEste metodo podrıa ser mas complejo incluso que lo esperadopermitiendo detectar fracciones equivalentes: 1/2 = 2/4

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 134

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio “Tell, Don’t Ask” - Ejemplo

Metodo equals de Racional sencillo

@Overridepublic boolean equals(Object obj) {

if (obj == null) {return false;

}if (getClass() != obj.getClass()) {

return false;}final Racional other = (Racional) obj;if (this.numerador != other.numerador) {

return false;}if (this.denominador != other.denominador) {

return false;}return true;

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 135

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio “Tell, Don’t Ask” - Ejemplo

Metodo equals de Racional usando equivalencias

@Overridepublic boolean equals(Object obj) {

if (obj == null) {return false;

}if (getClass() != obj.getClass()) {

return false;}final Racional other = (Racional) obj;// a/b y c/d, son equivalentes sı y solo sı a*d == b*cint valor1 = this.numerador * other.denominador;int valor2 = this.denominador * other.numerador;if (valor1 != valor2) {

return false;}return true;

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 136

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Principio “Tell, Don’t Ask” - Ejemplo

Clase UsaRacional siguiendo el principio

public class UsaRacional {public static void main(String[] args) {

Racional r1 = new Racional(1,2);if (r1.equals(new Racional(1,2)))

System.out.println("Tienes la mitad de la tarta...");

Racional r2 = new Racional(2,4);if (r2.equals(new Racional(1,2)))

System.out.println("Tienes la mitad de la otra tarta...");}

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 137

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Patron Fachada

Patron FachadaProvee de un interfaz unificado para un conjunto de clases en unsubsistema. La fachada actuarıa como un interfaz de alto nivel quehara que el subsistema sea mas facil de utilizar

Elementos:Fachada: Conoce que clases son las responsables de unadeterminada peticion y delega dicha peticion sobre esas clasesClases del subsistema: Implementan las funcionalidades delsubsistema y reciben las peticiones desde la fachada, aunquedesconocen su existencia

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 138

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Elementos del Patron Fachada

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 139

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron FachadaClases para controlar un sistema de “cine en casa”

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 140

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Fachada

Acciones a realizar al ver una pelıculaEncender la maquina de palomitasPonerla a hacer palomitasBajar las lucesBajar la pantallaEncender el proyectorPoner el proyector en el modo 16:9Encender el amplificador de sonidoIndicar que la entrada del amplificador es el DVDPoner el sonido envolvente en el amplificadorPoner el volumen del amplificador a la mitadEncender el DVDComenzar la reproduccion en el DVD

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 141

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Fachada“cine en casa” usando una fachada

verPeliculasimplifica la interaccion

con el subsistemaal ver una pelicula

El acceso a las clasesdel subsistema evitando

la fachada es posible

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 142

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Fachada

Clase CineCasaFachada

public class CineEnCasaFachada {private Amplificador amplificador;private Radio radio;private ReproductorDVD reproductorDVD;private ReproductorCD reproductorCD;private Proyector proyector;private Pantalla pantalla;private Palomitero palomitero;private Luces luces;

public CineEnCasaFachada(Amplificador amplificador, Radio radio,ReproductorDVD reproductorDVD, ReproductorCD reproductorCD,Proyector proyector, Pantalla pantalla, Palomitero palomitero,Luces luces) {

// ...}// ...

} La fachada conoce los objetossobre los cuales trabaja

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 143

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Ejemplo del Patron Fachada

Metodo verPelicula de CineEnCasaFachada

public void verPelicula(String pelicula) {palomitero.encender();palomitero.hacerPalomitas();luces.atenuar();pantalla.bajar();proyector.encender();proyector.modoPantallaAncha();amplificador.encender();amplificador.setDVD(reproductorDVD);amplificador.setSonidoEnvolvente();amplificador.setVolumen(5);reproductorDVD.encender();reproductorDVD.reproducir(pelicula);

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 144

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Patron Fachada

VentajasEl subsistema resulta mas facil de utilizar por parte de sus clientesBajo acoplamiento, la modificacion del subsistema no afecta a losclientes que lo utilizanLos clientes pueden seguir usando las clases del subsistema obviandola fachada si consideran que no corresponde con sus necesidades

Fachada vs. AdaptadorSe diferencian mas en la intencion que en su propia estructuraEl patron adaptador trata de alterar un interfaz para que coincidacon lo que el cliente se esperaEl patron fachada trata de ofrecer un interfaz simplificado sobre unsubsistema complejo

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 145

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Fachadas y casos de uso

El proceso de analisis de requisitos nos permite identificarque actores van a usar el sistema y como lo van a hacerEstos casos de uso pueden usarse para extraer Diagramas deSecuencia del Sistema (diagramas de alto nivel que tratan deidentificar las acciones que ofrece un sistema a un determinadoactor)Estas acciones pueden ser luego el origen de una fachada que elsistema ofrece al actorEn realidad la fachada es entre capas de la aplicacion: son lasfunciones que el modelo ofrece al interfaz grafico manejado por elactor

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 146

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Fachadas y casos de uso

Procesar una ventaen un supermercado

Flujo basico del caso de uso1 El Cliente llega al terminal con productos2 El Cajero comienza una nueva venta3 El Cajero introduce el identificador del producto4 El Sistema registra la venta y muestra la

descripcion del artıculo y el precio5 Se repiten los pasos 3-4 hasta que se indique el

final de la venta6 El Sistema presenta el total mas el IVA7 El Cajero le dice al Cliente el total y le pide que

pague8 El Cliente paga y el Sistema gestiona el pago9 El Sistema registra la venta10 El Sistema calcula el cambio y genera el recibo11 El Cliente recibe el recibo, el cambio y recoge

los productos

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 147

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Principio de “Bajo Acoplamiento”Patron ObservadorPatron AdaptadorPrincipio de Mınimo Conocimiento (Ley de Demeter)Principio “Tell, Don’t Ask” (Dile, No preguntes)Patron Fachada

Fachadas y casos de uso

Diagrama de secuencia del sistema

Fachada para un Cajero

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 148

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Indice

1 Introduccion a los Patrones de Diseno

2 Patrones Elementales

3 Disenos Adaptables a los Cambios

4 Patrones y Colecciones de Objetos

5 Disenos Debilmente Acoplados

6 Patrones Creacionales y Otros PrincipiosPatron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 149

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Metodo Factorıa

Metodo FactorıaDefine un interfaz para crear un objeto pero permitiendo que lassubclases sean las que decidan que objeto hay que crear

Despues de una instruccion new siempre tiene que ir una claseconcreta, no puede ir una clase abstracta o un interfazSi queremos abstraer el proceso de creacion de los objetos ydelegarlo en las subclases necesitamos crear objetos dentro demetodos especiales denominados metodos factorıa

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 150

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Elementos del Patron Metodo Factorıa

Producto: Define el inter-faz de los objetos creados

por el metodo factorıa

Producto concreto: Implemen-ta el interfaz de los productos

Creador: Declara el metodofactorıa, que devuelve unobjeto de tipo Producto

Creador concreto: Sobreescribeel metodo factorıa para

devolver una instancia deun ProductoConcreto

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 151

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Nuestra entidad financiera invierte el dinero de nuestros clientes endistintos tipos de fondosEn nivel creciente de riesgo (pero tambien de posibles beneficios)tenemos:

Fondos Garantizados: Nuestra companıa garantiza un interes dadoen un plazo de inversion determinadoFondos en Renta Fija: Invierten en obligaciones, bonos, letras,pagares, etc.Fondos Mixtos: Mezclan inversiones en renta fija y renta variableFondos en Renta Variable: Invierten en accionesFondos de Capital Riesgo: Invierten en empresas que no cotizan enbolsa (por ejemplo, startups)

Segun el perfil del inversor (conservador, arriesgado, etc.)invertiremos el dinero en un tipo de producto determinado

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 152

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo FactorıaFondoInversion jue-

ga el rol de Producto

Los distintos tipos defondo juegam el rol

de Producto concreto

FactoriaFondo jue-ga el rol de Creador

Las distintas factorıasconcretas juegan el rolde Creador concreto

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 153

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Clase FondoInversion

public abstract class FondoInversion {private int saldo;private final String nombre;

public FondoInversion(String nombre) {this.nombre = nombre;

}public FondoInversion(String nombre, int saldo) {

this.nombre = nombre;this.saldo = saldo;

}@Overridepublic String toString() {

return nombre + ": " + saldo + " EUR";}public int getSaldo() { return saldo; }public void setSaldo(int saldo) { this.saldo = saldo; }

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 154

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Clase FondoGarantizado

public class FondoGarantizado extends FondoInversion {public FondoGarantizado(int saldo) {

super("Fondo Garantizado", saldo);

// Invierte el dinero en activos garantizados}

}

Clase FondoRentaFija

public class FondoRentaFija extends FondoInversion {public FondoRentaFija(int saldo) {

super("Fondo Renta Fija", saldo);

// Invierte el dinero en renta fija}

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 155

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Clase FactoriaFondo

public abstract class FactoriaFondo {public abstract FondoInversion creaFondoInversion(int saldo);

}

Clase FactoriaFondoGarantizado

public class FactoriaFondoGarantizado extends FactoriaFondo {@Overridepublic FondoInversion creaFondoInversion(int saldo) {

return new FondoGarantizado(saldo);}

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 156

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Clase GestorCartera

public class GestorCartera {FactoriaFondo factoria;

public FondoInversion invertir(int cantidad) {if (factoria == null)factoria = obtenerFactoria();

return factoria.creaFondoInversion(cantidad);}

private FactoriaFondo obtenerFactoria() {int nivelRiesgo = calcularNivelRiesgo();if (nivelRiesgo < 20) return new FactoriaFondoGarantizado();else if (nivelRiesgo < 40) return new FactoriaFondoRentaFija();else if (nivelRiesgo < 60) return new FactoriaFondoMixto();else if (nivelRiesgo < 80) return new FactoriaFondoRentaVariable();else return new FactoriaFondoCapitalRiesgo();

}private int calcularNivelRiesgo() {// hacer encuesta...

}}

invertir dele-ga la creacion de

fondos a la factorıa

La factorıa se obtienesegun el nivel de riesgo

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 157

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Patron Metodo Factorıa

Posibles implementacionesFactorıa como metodo abstracto: El metodo factorıa se declaraabstracto en la superclase y debe ser redefinido por las subclases (nohay implementacion por defecto). Es el ejemplo visto hasta ahora.Factorıa como metodo concreto: El metodo factorıa no esabstracto (incluye una implementacion por defecto)Factorıa parametrizada: Los objetos se crean segun un parametroque se le pasa a la factorıa

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 158

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Factorıa como metodo concretoHabitualmente la superclase tampoco es abstractaNo es necesario utilizar las subclases si no se quiere. Pero se abre laposibilidad a definir una subclase especializada

Clase FactorıaFondo como metodo concreto

class FactoriaFondo {public FondoInversion creaFondoInversion(int saldo) {

// Por defecto creamos el mas conservadorreturn new FondoGarantizado(saldo);

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 159

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Clase GestorCartera con factorıa en metodo concreto

public class GestorCartera {

// ...

private FactoriaFondo obtenerFactoria() {// Si no hay un nivel de riesgo determinado// devolvemos el fondo por defectoif (nivelRiesgo < 0)return new FactoriaFondo();

else if (nivelRiesgo < 20) return new FactoriaFondoGarantizado();else if (nivelRiesgo < 40) return new FactoriaFondoRentaFija();else if (nivelRiesgo < 60) return new FactoriaFondoMixto();else if (nivelRiesgo < 80) return new FactoriaFondoRentaVariable();else return new FactoriaFondoCapitalRiesgo();

}

// ...}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 160

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Esta version del metodo factorıa obliga a tener dos jerarquıasparalelas, una para los productos y otra para las factorıasEsto puede evitarse con una version parametrizada de la factorıa enla cual solo existe una clase factorıa que crea un producto u otrosegun un parametro que se le pasaDe esta forma eliminamos la necesidad de las subclases aunque elproceso de creacion es menos abstracto (a la factorıa le indicamos loque tiene que crear)Sigue siendo posible crear subclases de la factorıa que alteren elcomportamiento predeterminado

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 161

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Clase FactoriaFondo parametrizada usando switch

class FactoriaFondo {public FondoInversion creaFondoInversion(String tipo, int saldo) {

switch (tipo) {case "FondoGarantizado":

return new FondoGarantizado(saldo);case "FondoRentaFija":

return new FondoRentaFija(saldo);case "FondoMixto":

return new FondoMixto(saldo);case "FondoRentaVariable":

return new FondoRentaVariable(saldo);case "FondoCapitalRiesgo":

return new FondoCapitalRiesgo(saldo);default:

return new FondoGarantizado(saldo);}

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 162

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Para evitar tener que crear una nueva entrada cada vez que se creaun nuevo producto (incumpliendo el principio abierto-cerrado)podemos usar otras estrategias para crear la factorıa parametrizada:Reflexion:

Usa la informacion de tipos en tiempo de ejecucion para crearobjetos a partir del String que representa su nombre

Genericidad:La factorıa usa la genericidad para crear objetos a partir de unareferencia a su clase

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 163

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Clase FactoriaFondo parametrizada usando reflexion

class FactoriaFondo {public FondoInversion creaFondoInversion(String tipo, int saldo) {

FondoInversion fondo = null;try {

fondo = (FondoInversion) Class.forName("fondos_inversion."+ tipo).newInstance();

fondo.setSaldo(saldo);} catch (Exception e) {

throw new IllegalArgumentException();}return fondo;

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 164

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Metodo Factorıa

Clase FactoriaFondo parametrizada usando genericidad

class FactoriaFondo {public <T extends FondoInversion> T creaFondoInversion(Class<T> tipo,

int saldo) {T fondo = null;try {

fondo = tipo.newInstance();fondo.setSaldo(saldo);

} catch (Exception e) {throw new IllegalArgumentException();

}return fondo;

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 165

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Patron constructor (builder)

Patron constructor (builder)Separa la construccion de un objeto complejo de su representacion, deforma que un mismo proceso de construccion pueda crear diferentesrepresentaciones

En esta definicion, incluida en el libro GoF, se enfatiza la posibilidadde usar polimorfismo para crear distintos tipos de objetosEn la actualidad el patron constructor se utiliza principalmente pararesolver el antipatron denominado Constructor Telescopico

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 166

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Antipatron constructor telescopico

Constructor telescopicoUn constructor telescopico es aquel constructor que tiene una version conlos parametros requeridos, luego otra version con los parametrosrequeridos y un parametro opcional, luego otra version con losparametros requeridos y dos parametros opcionales, etc.

Imaginemos una clase que representa los aspectos nutricionales deun producto denominada NutritionFacts

Esta clase tendra dos parametros obligatorios: tamano en el que sesirve (servingSize) y numero de raciones o servicios que incluye(servings)Los parametros optativos seran las calorıas (calories), la grasa(fat), el sodio (sodium) y los carbohidratos (carbohydrate)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 167

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Antipatron constructor telescopico

clase NutritionFacts (1/2)

public class NutritionFacts {private final int servingSize; // (mL) requiredprivate final int servings; // (per container) requiredprivate final int calories; // optionalprivate final int fat; // (g) optionalprivate final int sodium; // (mg) optionalprivate final int carbohydrate; // (g) optional

public NutritionFacts(int servingSize, int servings) {this(servingSize, servings, 0);

}public NutritionFacts(int servingSize, int servings, int calories) {

this(servingSize, servings, calories, 0);}public NutritionFacts(int servingSize,int servings,int calories,int fat) {

this(servingSize, servings, calories, fat, 0);}public NutritionFacts(int servingSize, int servings, int calories,int fat,

int sodium) {this(servingSize, servings, calories, fat, sodium, 0);

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 168

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Antipatron constructor telescopico

clase NutritionFacts (2/2)

public NutritionFacts(int servingSize, int servings, int calories,int fat, int sodium, int carbohydrate) {

this.servingSize = servingSize;this.servings = servings;this.calories = calories;this.fat = fat;this.sodium = sodium;this.carbohydrate = carbohydrate;

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 169

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Antipatron constructor telescopico

Construir un objeto NutritionFacts

public static void main(String[] args) {NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27);

}

ProblemasNo queda muy claro que representan los parametros que estamospasando por parametroA pesar de tener 5 constructores, no existe la opcion de dejar elparametro fat por defecto pero si incluir sodium ycarbohydrateLa solucion de poner aun mas constructores no parece razonableEn conclusion: el codigo funciona pero es complicado escribir codigoque lo use que sea sencillo y facil de leer

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 170

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Solucion: Usar el patron JavaBeans

Los JavaBeans son los componentes JavaBasicamente son objetos normales que se caracterizan por:

Tener un constructor sin parametrosSus atributos son privados.Estos atributos son accedidos mediante metodos de lectura y deescritura que siguen la nomenclatura estandar (get/set)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 171

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Solucion: Usar el patron JavaBeans

clase NutritionFacts como JavaBean

public class NutritionFacts {private int servingSize = -1; // Required; no default valueprivate int servings = -1; // " " " "private int calories = 0;private int fat = 0;private int sodium = 0;private int carbohydrate = 0;public NutritionFacts() { }

public void setServingSize(int val) { servingSize = val; }public void setServings(int val) { servings = val; }public void setCalories(int val) { calories = val; }public void setFat(int val) { fat = val; }public void setSodium(int val) { sodium = val; }public void setCarbohydrate(int val) { carbohydrate = val; }

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 172

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Solucion: Usar el patron JavaBeans

Construir un JavaBean NutritionFacts

public static void main(String[] args) {NutritionFacts cocaCola = new NutritionFacts();cocaCola.setServingSize(240);cocaCola.setServings(8);cocaCola.setCalories(100);cocaCola.setSodium(35);cocaCola.setCarbohydrate(27);

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 173

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Solucion: Usar el patron JavaBeans

ProblemasCrear instancias se hace mas pesado (mas codigo a teclear)El constructor sin parametros nos obliga a crear un objeto que puedeser utilizado sin estar en un estado consistenteLos objetos creados de esta forma no pueden ser inmutables

SolucionUsar el patron constructor (builder)

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 174

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Elementos del Patron ConstructorDirector: Construye un

objeto usando el in-terfaz del Constructor

Constructor: Especificauna interfaz abstracta para

crear las partes de un objeto

Constructor concreto: Im-plementa el interfaz delconstructor para crearun objeto determinado Producto: Representa el

objeto en construccion

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 175

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Ejemplo del Patron Constructor

El ejemplo de la clase NutritionFacts es una aplicacion delpatron concreta que trata de resolver el problema de losconstructores telescopicosEn dicho ejemplo no existe un constructor abstracto, el producto esNutritionFacts y el constructor es la clase Builder que esuna clase interna de NutritionFactsLa clase Director sera cualquier clase que crea el objeto dadousando el constructor

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 176

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Solucion: Usar el Patron Constructor

Clase NutritionFacts (1/2)

public class NutritionFacts {

private final int servingSize;private final int servings;private final int calories;private final int fat;private final int sodium;private final int carbohydrate;

private NutritionFacts(Builder builder) { // privadoservingSize = builder.servingSize;servings = builder.servings;calories = builder.calories;fat = builder.fat;sodium = builder.sodium;carbohydrate = builder.carbohydrate;

}

//...

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 177

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Solucion: Usar el Patron Constructor

Clase Builder interna de NutritionFacts (2/2)

public Builder(int servingSize, int servings) { // Clase internathis.servingSize = servingSize;this.servings = servings;

}public Builder calories(int val) { // Juegan el rol de

calories = val; return this; // construir parte}public Builder fat(int val) {

fat = val; return this;}public Builder sodium(int val) {

sodium = val; return this;}public Builder carbohydrate(int val) {

carbohydrate = val; return this;}public NutritionFacts build() { // Juega el rol de obtener resultado

return new NutritionFacts(this);}

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 178

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Solucion: Usar el Patron Constructor

Clase Director

public class Director {public static void main(String[] args) {

NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).calories(100).sodium(35).carbohydrate(27).build();

System.out.println(cocaCola);}

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 179

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Principios KISS y YAGNI

Fuente: xkcd.com

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 180

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Principios KISS y YAGNI

Principio KISS “Keep It Simple, Stupid” (Mantenlo sencillo, estupido)La simplicidad debe ser mantenida como un objetivo clave del diseno, ycualquier complejidad innecesaria debe ser evitada

Principio YAGNI “You Aren’t Gonna Need It” (No vas a necesitarlo)Implementar los cambios cuando realmente se necesiten, no cuando solose prevea que se necesitaran

Ambos principios son propios de las metodologıas agiles e intentanque no caigamos en la sobreingenierıa

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 181

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Principios KISS y YAGNI

Sobre-Ingenierıa (Over-Engineering)Hacer el codigo mas flexible o sofisticadode lo necesarioSe hace para anticipar futuras necesidades,pero predecir el futuro es una tareaarriesgadaSi las predicciones no son correctasperdemos un tiempo valioso en hacercodigo innecesarioSiguiendo la norma “no arregles lo que noesta roto” este codigo nuncasera eliminado, lo que podrıa complicarfuturas modificaciones no previstas

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 182

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Principios KISS y YAGNI

Como implementar el Hola Mundo usando los patronesEstrategia, Factorıa e Instancia Unica

Clase HelloWorld

class HelloWorld {public static void main(String[] args) {

MessageBody mb = new MessageBody();mb.configure("Hello World!");AbstractStrategyFactory asf

= DefaultFactory.getInstance();MessageStrategy strategy = asf.createStrategy(mb);mb.send(strategy);

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 183

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Principios KISS y YAGNI

Clase MessageBody

class MessageBody {private Object payload;public Object getPayload() { return payload; }public void configure(Object obj) { payload = obj; }public void send(MessageStrategy ms) { ms.sendMessage(); }

}

Clase MessageStrategy

interface MessageStrategy { public void sendMessage(); }

Clase AbstractStrategyFactory

abstract class AbstractStrategyFactory {public abstract MessageStrategy createStrategy(MessageBody mb);

}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 184

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Principios KISS y YAGNI

Clase DefaultFactory

class DefaultFactory extends AbstractStrategyFactory {private static DefaultFactory instance;private DefaultFactory() {}

public static AbstractStrategyFactory getInstance() {if (instance == null) { instance = new DefaultFactory(); }return instance;

}@Overridepublic MessageStrategy createStrategy(final MessageBody mb) {

return new MessageStrategy() {MessageBody body = mb;

@Overridepublic void sendMessage() {

Object obj = body.getPayload();System.out.println((String) obj);

}};

}}

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 185

Introduccion a los Patrones de DisenoPatrones Elementales

Disenos Adaptables a los CambiosPatrones y Colecciones de Objetos

Disenos Debilmente AcopladosPatrones Creacionales y Otros Principios

Patron Metodo FactorıaPatron ConstructorPrincipios KISS y YAGNI

Principios KISS y YAGNI

Infra-Ingenierıa (Under-Engineering)Se refiere a codigo pobremente disenado y es problema mas comunque afecta al disenoLos disenos incorrectos surgen por diversas causas: No ha habidotiempo suficiente, no tenemos los conocimientos necesarios, etc.Un diseno incorrecto que funcione correctamente nuncasera modificado aplicando la norma “no arregles lo que no esta roto”A medida que el proyecto va avanzando y se anade mas codigo, mascomplicado se hace poder corregir el codigo pobremente disenado.Al final puede llegarse a la necesidad de realizar una completareescritura para adaptarse a las nuevas necesidades.

E. Mosqueira Rey (Coordinador), D. Alonso Rıos Tema 6: Patrones de Diseno 186

Tema 6: Patrones de DisenoDiseno Software (614G01027)

Eduardo Mosqueira Rey (Coordinador)David Alonso Rıos

Departamento de Computacion, Facultad de Informatica