82
 1 Reutilización del Software Patrones de Diseño

06Patrones

Embed Size (px)

Citation preview

Page 1: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 1/821

Reutilización del Software

Patrones de Diseño

Page 2: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 2/822

Introducción

• El diseño OO es difícil y el diseño de softwareorientado a objetos reutilizable lo es aún más.

• Los diseñadores expertos no resuelven los

problemas desde sus principios; reutilizansoluciones que han funcionado en el pasado. – Se encuentran patrones de clases y objetos de

comunicación recurrentes en muchos sistemas

orientados a objetos. – Estos patrones resuelven problemas de diseñoespecíficos y hacen el diseño flexible y reusable.

Page 3: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 3/82

3

Definición de un patrón

Alexander(arquitecto/urbanista)

Cada patrón describe un problema queocurre una y otra vez en nuestro

entorno y describe también el núcleo dela solución al problema, de forma quepuede utilizarse un millón de veces sin

tener que hacer dos veces lo mismo.

Page 4: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 4/82

4

Definición de un patrón de diseño

[Gamma]Un patrón de diseño es una descripción

de clases y objetos comunicándoseentre sí adaptada para resolver unproblema de diseño general en uncontexto particular.

Page 5: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 5/82

5

Introducción

• Es un tema importante en el desarrollo desoftware actual: permite capturar la experiencia

• Busca ayudar a la comunidad de desarrolladoresde software a resolver problemas comunes,creando un cuerpo literario de base – Crea un lenguaje común para comunicar ideas y

experiencia acerca de los problemas y sus soluciones• El uso de patrones ayuda a obtener un software

de calidad (reutilización y extensibilidad)

Page 6: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 6/82

6

Elementos de un patrón

• Nombre: describe el problema de diseño.• El problema: describe cuándo aplicar el

patrón.• La solución: describe los elementos que

componen el diseño, sus relaciones,responsabilidades y colaboración.

Page 7: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 7/82

7

Más información en...

• Desing Patterns. E. Gamma, R. Helm, R.Johnson, and J. Vlissides. Design Patterns .

Addison Wesley, 1995.

• Patterns Home Page: http://hillside.net/patterns/ 

• Thinking in patterns with javahttp://www.mindview.net/Books/TIPatterns/ 

Page 8: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 8/82

8

Clasificación de los patrones

• Según su propósito: – De creación: conciernen al proceso de creación

de objetos.

 – De estructura: tratan la composición de clasesy/o objetos.

 – De comportamiento: caracterizan las formas en

las que interactúan y reparten responsabilidadeslas distintas clases u objetos.

Page 9: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 9/82

9

Estructural ComportamientoCreación

Clase

Objeto

üFactory Method üAdapter Interpreter

Template Method

Abstract Factory

Builder

Prototype

üSingleton

üAdapter

Bridge

üComposite

DecoratorüFacade

Flyweight

Proxy

Chain of Responsability

Command

üIterator

Mediator

MementoüObserver

State

üStrategy

Visitor

Propósito

Ámbito

Además: PATRONES DE DISEÑO FUNDAMENTALES

Clasificación de los patronesGoF (gang of Four) [Gamma]

Page 10: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 10/82

10

Patrones de diseño fundamentales

Son patrones que no aparecen la tabla definidapor Gamma, pero se utilizan habitualmente:

• DELEGATION• INTERFACE

• MARKER INTERFACE

Page 11: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 11/82

11

Patrón DELEGATION

Utilidad:

Cuando se quiere extender y reutilizar lafuncionalidad de una clase SIN UTILIZAR LA

HERENCIAVentajas:

• En vez de herencia múltiple

• Cuando una clase que hereda de otra quiereocultar algunos de los métodos heredados

• Compartir código que NO se puede heredar

Page 12: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 12/82

12

Patrón DELEGATIONEl problema

Clase A

a1()….

Clase B

b1(),b2()….

Clase C

a1(), b1(), b2()

….

- El lenguaje utilizado NO PERMITE HERENCIA MÚLTIPLE

- La clase C no desea TODOS los métodos de B

Page 13: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 13/82

13

Patrón DELEGATIONLa solución

Clase A

a1()….

Clase B

b1(), b2()….

Clase C

a1(), b1()

….

NO USAR HERENCIA

SINO LA RELACIÓN “USA”

usa

El método b1() habrá queañadirlo a C

Page 14: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 14/82

14

Patrón DELEGATIONImplementación

class C extends A {

B objB;

C ( ) { // En la constructora se puede crear obj. de B

objB=new B();

}

void b1( ) { objB.b1( );}

….

Page 15: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 15/82

15

Patrón INTERFACEUtilidad y Ventajas

Utilidad

Definir un comportamiento independiente de

donde vaya a ser utilizado

Ventajas

Desacople entre comportamiento y clase.Realización de clases “Utilities”

Page 16: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 16/82

16

Patrón INTERFACEEl problema

Utilities

void imprimirEstructura (????? o) {o.irAlPrimero();while (o.tieneElems() );

imprimir (o.obtenerSiguiente() );}

Todos los objeto o, tienen que implementar:irAlPrimero(), tieneElems(), obtenerSiguiente().

Problema: De qué tipo son los objetos o?

Page 17: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 17/82

17

Patrón INTERFACELa solución

Clase UtilitiesImprimirEstructura(Recorrible o)

….

Interfaz Recorrible

irAlPrimero(),tieneElems(),obtenerSiguiente().

usa

Clase A

Solución: Definir los parámetros de un tipo Interfaz.Todas las clases(instancias) que quieran utilizar ese comportamiento

deberán implementar dicho interfaz

implementa

irAlPrimero(),tieneElems(),

obtenerSiguiente().

Page 18: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 18/82

18

Patrón INTERFACEImplementación

class MiClase<T> implements Recorrible<T> {

Vector<T> v=new Vector<T>();

int pos;

void irAlPrimero() { pos=0;}

boolean tieneElems() {v.lenght < pos;}

T obtenerSiguiente() {

T o=v.elementAt(pos); pos++;

return o; }

}

}

Page 19: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 19/82

19

Patrón INTERFACEEjemplo

 // Estructuras de datos, algoritmos y predicados JGLArray queue = new Array( );queue.add( ...);

Counting.countIf(queue, new MayorEdad());

class MayorEdad implements UnaryPredicate {

public boolean execute (Object o1){ ...... } }

Definición: Counting.countIf(Container,UnaryPredicate);

Uso decountIf 

Page 20: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 20/82

20

Patrón MARKER INTERFACEUtilidad y Ventajas

• Utilidad – Sirve para indicar atributos semánticos de

una clase.

• Ventajas: – Se puede preguntar si un objeto pertenece

a una clase de un determinado tipo o no.

 – Habitualmente se utiliza en clases deutilidades que tienen que determinar algosobre objetos sin asumir que soninstancias de una determinada clase o no.

Page 21: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 21/82

21

Patrón MARKER INTERFACE

Clase Utilidad

operacion(Object o)….

Interfaz Markerusa

Clase Marcadam1()….

Dentro del código del método operacion(Object o) de la

clase Utilidad podemos preguntar si el objeto o es de unaclase Marker:

if (o instanceof Marker) {...}

else {...}

Clase NoMarcadanm1()….

Page 22: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 22/82

22

Patrón MARKER INTERFACEEjemplo

En Java hay clases “serializables”,

“cloneables”, etc. Para ello, basta conque implementen las interfacesSerializable, Cloneable, etc.

Page 23: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 23/82

23

Estructural ComportamientoCreación

Clase

Objeto

üFactory Method üAdapter Interpreter

Template Method

Abstract Factory

Builder

PrototypeüSingleton

üAdapter

Bridge

üComposite

DecoratorüFacade

Flyweight

Proxy

Chain of Responsability

Command

üIterator

Mediator

Memento

üObserver

State

üStrategy

Visitor

Propósito

Ámbito

Clasificación de los patronesGoF (gang of Four) [Gamma]

Page 24: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 24/82

24

Patrón SINGLETON

• Utilidad

 – Asegurar que una clase tiene una sola instancia yproporcionar un punto de acceso global a ella

• Ventajas – Es necesario cuando hay clases que tienen que

gestionar de manera centralizada un recurso – Una variable global no garantiza que sólo se instancie

una vez

Page 25: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 25/82

25

Patrón SINGLETONLa solución

Clase CSingleton

- CSingleton laInstancia….

- CSingleton ()

+ getInstance ()

Atributos

Métodos

- indica que es private + indica que es public

Métodostatic

 – El constructor de la clase DEBE SER PRIVADO

 – Se proporciona un método ESTÁTICO en la clase que devuelveLA ÚNICA INSTANCIA DE LA CLASE: getInstance()

Page 26: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 26/82

26

Patrón SINGLETONImplementación

public class CSingleton {

private static CSingleton laInstancia = new CSingleton();

private CSingleton() {}public static CSingleton getInstance() {

return laInstancia;

}………………………….

}

Page 27: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 27/82

27

Patrón SINGLETONInconvenientes

Se podría obtener una nueva instancia usando el esquema anterior:

 public class MiCSingleton extends CSingleton

implements Cloneable {}

 MiCSingleton mcs = new MiCSingleton();

 MiCSingleton mcsCopia = mcs.clone();

Para solucionarlo: definir CSingleton como final

 public final class CSingleton {...}

Page 28: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 28/82

28

public final class Facultad implements Serializable {private Vector listaProfesores;private Vector listaEstudiantes;private Vector listaAsigs;private Vector listaMatrs;private static Facultad laFacultad=new Facultad();private Facultad() // EL CONSTRUCTOR ES PRIVADO

{ listaProfesores = new Vector();  // Sólo hay UNA instancialistaEstudiantes= new Vector();  // y se guarda en laFacultad 

listaAsigs = new Vector();listaMatrs = new Vector(); }

public static Facultad getInstance() {return laFacultad;}public Vector obtListaProfesores(){return listaProfesores;}

public void anadirProfesor(Profesor p){listaProfesores.addElement(p); }

EJEMPLO DE

PATRÓNSINGLETON

Page 29: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 29/82

29

Utilidad

Separar la clase que crea los objetos, de la jerarquía de objetos a instanciar

Ventajas

 – Centralización de la creación de objetos – Facilita la escalabilidad del sistema – El usuario se abstrae de la instancia a crear

Patrón FACTORY METHOD

Page 30: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 30/82

30

Patrón FACTORY METHODEl problema

Clase A

oper1()oper2()

...

Clase A’

oper1()oper2()...

Clase A’’

oper1()oper2()...

If (tipo==1)create A’elsecreate A’’

Programa1

If (tipo==1)create A’elsecreate A’’

Programa2

Problema: Qué sucede si queremos añadir A’’’?

Page 31: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 31/82

31

Patrón FACTORY METHODUna primera solución

Clase A

oper1()oper2()static A create(tipo)

Clase A’

oper1()

oper2()...

Clase A’’

oper1()

oper2()...

A.create(1);

Programa1

A.create(2)Programa2

Solución: Hay que recompilar todas las clases que heredan de A

Puede que no tengamos acceso al código de A

Page 32: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 32/82

32

Patrón FACTORY METHODLa solución final

Interfaz A

oper1()oper2()

...

Clase CFactoryA create(tipo)

….

Solución: Separar el creador de las instancias de la propia clase

las instancias se crean en una clase CFactory

Clase A1

oper1()oper2()...

Clase A2

oper1()oper2()...

Page 33: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 33/82

33

Patrón FACTORY METHOD

class Aplicación {...A newA(...) {

A miA;

CFactory fact= new CFactory();

...miA = fact.create(“TIPO 2”);...return miA; }

• No se crean las instancias directamente en Aplicación

• Si se quisiera añadir un nuevo A A’’’, NONECESARIAMENTE habría que modificar la claseAplicación. Los tipos que CFactory puede crear los puededevolver un método y Aplicación trabajar con él.

Page 34: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 34/82

34

Patrón FACTORY METHOD

class CFactory {...A create(String tipo) {

if (“TIPO 1”.equals(tipo))

return new A1();

else if (“TIPO 2”.equals(tipo))

return new A2(); .... }

• Se crean las instancias de los Aes en CFactory, no en la claseAplicación

• Se pueden añadir nuevos Aes sin modificar Aplicación. Bastacon añadir la clase A3 y modificar CFactory (añadir el tipocorrespondiente a dicho A: “TIPOX”)

Page 35: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 35/82

35

Estructural ComportamientoCreación

Clase

Objeto

üFactory Method üAdapter Interpreter

Template Method

Abstract Factory

Builder

PrototypeüSingleton

üAdapter

Bridge

üComposite

DecoratorüFacade

Flyweight

Proxy

Chain of Responsability

Command

üIterator

Mediator

Memento

üObserver

State

üStrategy

Visitor

Propósito

Ámbito

Clasificación de los patronesGoF (gang of Four) [Gamma]

Page 36: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 36/82

36

Patrón ADAPTER

Intención

Convertir la interfaz de una clase en otra interfaz esperada por losclientes.

Permite que clases con interfaces incompatibles se comuniquen

VentajasSe quiere utilizar una clase ya existente y su interfaz no secorresponde con la interfaz que se necesita

Se quiere envolver código no orientado a objeto con forma declase

ó

Page 37: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 37/82

37

Patrón ADAPTEREl problema

Clase A usa Interfaz C

Clase B

m1(….)m2(….)….

b1(….)b2(….)

….

Se desea utilizar la clase A (el métodoejec) utilizando como entrada unobjeto de la clase B

objetoDeA.ejec(objetoDeB)

Pero no se puede, ya que la clase Bno implementa la interfaz C

ejec(Interfaz C)

P ó ADAPTER

Page 38: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 38/82

38

Patrón ADAPTERLa solución

usa Interfaz Cm1(….)m2(….)….

Clase B

b1(….)b2(….)….

Clase Aejec(Interfaz C)

Solución: construir una clase Adaptadora de B que implemente lainterfaz C. Al implementarla, usa un objeto de B y sus métodos

Clase AdapterB

m1(….)m2(….)

….

usa

Para utilizar la clase A:objetoDeAdapterB =NEW AdapterB(objetoDeB)

AdapterB(B)

objetoDeA.ejec(objetoDeAdapterB)

P ó ADAPTER

Page 39: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 39/82

39

Patrón ADAPTERDiagrama de interacción

El cliente quiere usar el objeto a (para que ejecute elmétodo ejec) con un objeto de b. Para ello necesita

crear un objeto adaptador que encapsule b

ab: AdapterBnew AdapterB(b)

ejec(ab)

ab

a : A

m1(...)b1()

b : B

m2(...)

b2()

: Cliente

Page 40: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 40/82

40

Patrón ADAPTER

• Convierte la interfaz de una clase enotra interfaz que los clientes esperan.Permite que clases con interfacesincompatibles puedan ser utilizadasconjuntamente. – La interfaz de la clase B (los métodos

b1(),b2()…) los convierte/adapta a losmétodos esperados por la clase A(métodos m1(),m2(),…)

P t ó ADAPTER

Page 41: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 41/82

41

Patrón ADAPTEREjemplo de uso en JGL

usaInterfaz Sequence

Array Java nativo: int[]

Clase Sorting

sort(Sequence)

OBJETIVO: PODER USAR LOS ALGORITMOS DE JGL CON int []

int ints[] = { 3, -1, 2, -3, 4 };IntArray intArray = new IntArray( ints );

Sorting.sort( intArray );

Clase IntArrayusa

IntArray(int [] )

 add , clear, isEmpty, size. (de Container)

 at, put, contains, ...

Operaciones con arrays:

acceso elº i: int[i], ...

Implementa: add ,

 clear, isEmpty, size..Adapter proporcionado por JGL

De JGL

De Java

P t ó ADAPTER

Page 42: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 42/82

42

Patrón ADAPTEREjemplo I

class WhatIUse {

 public void op(WhatIWant wiw)

{ wiw.f();} }

class WhatIHave { public void g() {}

 public void h() {} }

class Adapter implements WhatIWant {

 WhatIHave whatIHave;

 public Adapter(WhatIHave wih) {whatIHave = wih; }

 public void f() {

// Implementa usando los

// métodos de WhatIHave:

whatIHave.g();

whatIHave.h(); } }

interface WhatIWant{ void f(); }

P t ó ADAPTER

Page 43: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 43/82

43

Gráfico 

Dibujar( )

Mover( )

Polígono

Dibujar( )

Mover( )

Cuadrado

Dibujar( )

Mover( )

Círculo

Dibujar( )

Mover( )

Label

Draw( )

Move( )

Texto

Dibujar( )

Mover( )

♦Extender un editor gráfico con clases de otro toolkit

Patrón ADAPTEREjemplo II

Page 44: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 44/82

44

Patrón COMPOSITE

IntenciónComponer objetos en jerarquías todo-parte y permitir a los clientestratar objetos simples y compuestos de manera uniforme

Ventajas

♦Permite tratamiento uniforme de objetos simples y complejos asícomo composiciones recursivas

♦Simplifica el código de los clientes, que sólo usan una interfaz♦Facilita añadir nuevos componentes sin afectar a los clientes

Inconvenientes♦Es difícil restringir los tipos de los hijos♦Las operaciones de gestión de hijos en los objetos simples puedenpresentar problemas: seguridad frente a flexibilidad

P t ó COMPOSITE

Page 45: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 45/82

45

Patrón COMPOSITEEl problema: La escalabilidad

Documento

Página

MarcoColumna

ImagenLíneaDeTexto

Carácter

Un documento está formado por varias páginas, las cuales están formadas por columnas quecontienen líneas de texto, formadas por caracteres.

Las columnas y páginas pueden contener marcos. Los marcos pueden contener columnas.

Las columnas, marcos y líneas de texto pueden contener imágenes.

P t ó COMPOSITE

Page 46: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 46/82

46

Patrón COMPOSITELa solución

ElementoDeDocumento

Carácter Imagen ElemDeDocCompuesto

Documento Página Columna Marco LíneaDeTexto

Un documento está formado por varias páginas, las cuales están formadas porcolumnas que contienen líneas de texto, formadas por caracteres.Las columnas y páginas pueden contener marcos. Los marcos puedencontener columnas.

Las columnas, marcos y líneas de texto pueden contener imágenes.

0..n

Patrón COMPOSITE

Page 47: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 47/82

47

Patrón COMPOSITELa solución

 para cada hijo en m_hijo

hijo->Operación();

Simple

Operación()Compuesto

Operación()Add(c : Componente)

Remove(c : Componente)Iterar() : Componente

m_hijo

Cliente Componente 

Operación() unCompuesto

unCompuesto

unSimpleunSimpleunSimple

unSimple unSimple

♦Participantes

♦Componente: declara una clase abstracta para la composición de objetos,

Simple: representa los objetos de la composición que no tienen hijos eimplementa sus operaciones

♦Compuesto: implementa las operaciones para los componentes con hijos yalmacena a los hijos

♦Cliente: utiliza objetos de la composición mediante la interfaz de Componente

Patrón COMPOSITE

Page 48: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 48/82

48

Patrón COMPOSITEEjemplo: La jerarquía de clases de AWT

• Sirve para diseñar clases que agrupena objetos complejos, los cuales a su vezestán formados por objetos complejos

y/o simples

• La jerarquía de clases AWT se ha diseñado

según el patrón COMPOSITE

P t ó COMPOSITE

Page 49: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 49/82

49

Patrón COMPOSITEEjemplo: La jerarquía de clases de AWT

COMPONENTE

CONTENEDOR(todo contenedor esun componente)

Applet

Las posibilidades son infinitas…

- Una ventana formada por 2 cajas de texto, 2 campos de texto, 3 botones, 1panel que contenga 5 casillas de validación y una lista desplegable.-Una ventana formada por 2 etiquetas, 2 campos de texto y un botón-…Además, añadir nuevos tipos de contenedores y de componentes no sería muycostoso (estaríamos ante una solución extensible)

Page 50: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 50/82

50

Patrón COMPOSITEUn diseño francamente malo …

Frame

Button

CheckBox

TextField

- Se necesitarían métodos addButton, addCheckBox, addTextField,

addFrame en la clase Frame (y los correspondientes a todos los que faltan- Además el diagrama está muy incompleto, ya que un Button puede sercomponente de un Panel, Dialog, …- Si se quisiera añadir un nuevo componente XXX, habría que cambiar la

clase Frame y añadir el método addXXX (nada extensible)

*

*

**

Page 51: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 51/82

51

Componentes principales de Swing

JComponent

JFrame

JWindow

JPanelJDialog

JList JComboBox

JMenuBar

JTextField,JTextArea,JButton…

Applet

JApplet

Page 52: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 52/82

52

Intención: El patrón FACADE simplifica el acceso aun conjunto de clases proporcionando una únicaclase que todos utilizan para comunicarse con dicho

conjunto de clases.Ventajas

 – Los clientes no necesitan conocer las clases quehay tras la clase FACADE

 – Se pueden cambiar las clases “ocultadas” sinnecesidad de cambiar los clientes. Sólo hay querealizar los cambios necesarios en FACADE

Patrón FACADE

Patrón FACADE

Page 53: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 53/82

53

Patrón FACADEEl problema

Clase A

a1()….

Clase D

d1()….

Clase C

c1()….

Clase B

b1()….

usa

usa

usa

Clase CLIENTE

Clases SERVIDORAS

La clase A debe saber cuáles exactamente la clase quele proporciona el servicio:b1() es de B, c1() de C, d1()

de D, ...

Patrón FACADE

Page 54: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 54/82

54

Patrón FACADEEl problema

Clase CLI1

cl11()….

Clase D

d1()….

Clase C

c1()….

Clase B

b1()….

usa

usa...

Clases CLIENTES Clases SERVIDORAS

Problema: Además puede haber

muchas clases cliente...

Clase CLI2

cl21()….

Clase CLI3cl31()….

Patrón FACADE

Page 55: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 55/82

55

Patrón FACADELa solución

Clase CLI1

cl11()….

Clase D

d1()….

Clase C

c1()….

Clase B

b1()….

Clases CLIENTES Clases SERVIDORAS

Solución: Proporcionar una clase queimplemente todos los servicios (b1()…).

Los clientes sólo usarán dicha clase.

Clase CLI2

cl21()….

Clase CLI3cl31()….

Clase Facade

b1(), c1(), d1(),..

usausa

 public class Facade { 

  B objB = new B();

C objC = new C();…

void b1() { objB.b1();}..}

Patrón FACADE

Page 56: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 56/82

56

Compilador

Clases delsubsistema decompilación

EditorDepurador

Linkador

Token

AnaLexAnaSin

ASA TabSim

Compilar()

Patrón FACADEEjemplo: Estructurar un entorno de programación

Clasificación de los patrones

Page 57: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 57/82

57

Estructural ComportamientoCreación

Clase

Objeto

üFactory Method üAdapter Interpreter

Template Method

Abstract Factory

Builder

PrototypeüSingleton

üAdapter

Bridge

üComposite

Decorator

üFacade

Flyweight

Proxy

Chain of Responsability

Command

üIterator

Mediator

Memento

üObserverState

üStrategy

Visitor

Propósito

Ámbito

Clasificación de los patronesGoF (gang of Four) [Gamma]

ó OBS

Page 58: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 58/82

58

• Intención – Definir una dependencia 1:n de forma que

cuando el objeto 1 cambie su estado, los n objetos sean notificados y se actualicenautomáticamente

• Motivación – En un toolkit de GUI, separar los objetos

de presentación (vistas) de los objetos dedatos, de forma que se puedan tenervarias vistas sincronizadas de los mismosdatos (editor-subscriptor)

Patrón OBSERVER

Patrón OBSERVER

Page 59: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 59/82

59

a = 50%b = 30%c = 20%

notificación de cambiopeticiones, modificaciones

sujeto

observadores

Patrón OBSERVEREjemplo

Patrón OBSERVER

Page 60: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 60/82

60

Clases OBSERVADORAS(Vistas)

Interfaz Observer

update()….

Clase OBSERVADA(Modelo)

susObservers

0..*

Clase ObsConcreta

update() {

 // Qué hacer cuando // cambie el “objeto // observado” suSubject

 // Llamará: suSubject.get()

} ...

suSubject

Se implementaañadiendo el atributo

Observable suSubjecten ObsConcreta

Se implementaañadiendo el atributo

Vector susObserversen Subject

Class ObsConcreto

set(...){ // call notifyObservers()}

get() {...}

.....1

Class ObservableaddObserver(Observer)removeObserver(Observer)

notifyObservers()setChanged()

Patrón OBSERVERLa solución

Patrón OBSERVER

Page 61: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 61/82

61

Patrón OBSERVERDiagrama de interacción

s: Observable oi: Observer

set(...)

update()Llama a update()para cada objetode susObservers

get(...)

“actualizarse con losnuevos valores” de s

addObserver(oi) Registrarse como“observador” de s

Se cambia algúnvalor de s

setChanged()

notityObservers()

Patrón OBSERVER

Page 62: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 62/82

62Este método es invocado cuando el objeto observado ha cambiadoupdate()

 countObservers

 deleteObservers

 deleteObserver(o)

 addObserver (o)Métodos 

 notifyObservers

 hasChanged 

 setChanged()Devuelve el número de observadores

Elimina todos los observadoresElimina el observador oAñade un nuevo observador o

Notifica a todos los objetos suscritos si el objeto esta enEstado “modificado”

Devuelve cierto si el objeto esta “modificado”marca el objeto como “modificado”

Significado 

Patrón OBSERVERLa clase Observable

La interfaz Observer

Patrón OBSERVER

Page 63: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 63/82

63

Patrón OBSERVEROtro Ejemplo

http://csis.pace.edu/~bergin/mvc/mvcgui.htmlBuilding Graphical User Interfaces

with the MVC Pattern

Patrón OBSERVER

Page 64: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 64/82

64

Patrón OBSERVEREjemplo: La clase Observable (el modelo)

package mvc;import java.util.*;public class Observado extends java.util.Observable{

public double getF(){return temperatureF;}public double getC(){return (temperatureF - 32.0) * 5.0 / 9.0;}public void setF(double tempF){

temperatureF = tempF;setChanged();notifyObservers();

}public void setC(double tempC){

temperatureF = tempC*9.0/5.0 + 32.0;setChanged();notifyObservers();

}private double temperatureF = 32.0;

}

Patrón OBSERVER

Page 65: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 65/82

65

Patrón OBSERVEREjemplo: La clase Observer (la vista)

public class Observador implements java.util.Observer{

private Observado modelo;public Observador(Observado model)

{modelo=model;model.addObserver(this); // Conecta la Vista con el Modelo}public void update(Observable t, Object o) // Invocada desde el modelo

{ System.out.println("La temperatura ha cambiado" + modelo.getF());}

}

Patrón OBSERVER

Page 66: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 66/82

66

Patrón OBSERVEREjemplo: El programa principal

public static void main(String[] args) {Observado o=new Observado();Observador ob=new Observador(o);Observador2 ob2=new Observador2(o);

o.setF(45.5);}

The temperature has changed45.5

 La temperatura ha cambiado45.5

Process exited with exit code 0.

OBSERVABLE

Page 67: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 67/82

67

Ejemplo de patrón OBSERVER

OBSERVABLE

OBSERVER

...bli l Ob Q Pi t t d F

Page 68: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 68/82

68

public class ObserverQuePinta extends Frameimplements Observer{

Label label1 = new Label();

Panel panel1 = new Panel();Observable suSubject;

public ObserverQuePinta(Observable s) {suSubject = s;s.addObserver(this);

}public void update() {

String c = suSubject.getColor();

if (c.equals("ROJO")) panel1.setBackground(Color.red);else if (c.equals("VERDE")) panel1.setBackground(Color.green);else if (c.equals("AZUL")) panel1.setBackground(Color.blue);

} }

public interface Observer {void update();

}

VISTA

Page 69: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 69/82

69

public class Subject extends Observable {Choice choice1 = new Choice();public Subject() {

choice1.addItem("ROJO"); choice1.addItem("VERDE");choice1.addItem("AZUL");

choice1.addItemListener(new java.awt.event.ItemListener() {public void itemStateChanged(ItemEvent e) {

setChanged();notifyObservers(); }}

} public String getColor() {return choice1.getSelectedItem();}}

MODELO

Patrón OBSERVER

Page 70: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 70/82

70

Subject s = new Subject();Observer o1 = new ObserverQuePinta(s);

Observer o2 = new ObserverQuePinta(s);

CREACIÓN DE OBJETOS SUBJECTY OBSERVER

Patrón OBSERVERInicialización

Patrón OBSERVER

Page 71: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 71/82

71

• Si se quisiera añadir un nuevo OBSERVERque en vez de pintar escribiera un númeropara cada color (1 si ROJO, 2 si VERDE, 3 siAZUL), ¿qué habría que hacer?

 – Escribir nueva clase OBSERVER que implemente“notificar”

• Si se quisiera cambiar el SUBJECT paraescoger el color pinchando un Checkbox en

vez de escogerlo de un Choice – Hay que sustituir el Subject y llamar a “notificar”de los observers cuando se seleccione un nuevoCheckbox

A

B

Patrón OBSERVERAdaptabilidad de la solución

...public class ObserverQueEscribeNums extends Frame

Page 72: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 72/82

72

implements Observer{Label label1 = new Label();TextArea textArea1 = new TextArea();Subject suSubject;public ObserverQueEscribeNums(Subject s) {

suSubject = s;s.addObserver(this); ... }

public void update() {String c = suSubject.getColor();if (c.equals("ROJO"))

textArea1.append("NUEVO COLOR: "+1+"\n");

else if (c.equals("VERDE"))textArea1.append("NUEVO COLOR: "+2+"\n");else if (c.equals("AZUL"))

textArea1.append("NUEVO COLOR: "+3+"\n");} }

public interface Observer {

void notificar();}

EXTENDER CON UN NUEVO OBSERVER

A

CAMBIAR DE SUBJECT

Page 73: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 73/82

73

...public class Subject extends Frame {Checkbox checkbox1 = new Checkbox();Checkbox checkbox2 = new Checkbox(); // ... y checkbox3CheckboxGroup checkboxGroup1 = new CheckboxGroup();public Subject() {

checkbox1.setLabel("ROJO");checkbox1.setCheckboxGroup(checkboxGroup1);

checkbox1.addItemListener(new java.awt.event.ItemListener() {public void itemStateChanged(ItemEvent e) {notificar(); } });

checkbox2.setLabel("VERDE"); // y checkbox3.setLabel("AZUL");...public void addObserver(Observer o) {susObservers.addElement(o);}

public void notificar() {setChanged();notifyObservers(); } }

public String getColor() {return checkboxGroup1.getSelectedCheckbox().getLabel();} }

CAMBIAR DE SUBJECT

B

Page 74: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 74/82

74

Patrón STRATEGY

Page 75: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 75/82

75

Intención: – Encapsular algoritmos relacionados en

clases y hacerlos intercambiables.

 – Se permite que la selección del algoritmose haga según el objeto que se trate.

Ventajas

 – Se permite cambiar el algoritmodinámicamente

 – Se eliminan sentencias condicionales paraseleccionar el algoritmo deseado

Patrón STRATEGY

Patrón STRATEGY

Page 76: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 76/82

76

MétodoResolución 

Resolver()

SistemaLineal 

...

Resolver ()

...

MétodoResolución1

Resolver ()

MétodoResolución2

Resolver ()

MétodoResolución3

Resolver ()

instancia->Resolver();

Patrón STRATEGYLa solución

Patrón STRATEGY

Page 77: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 77/82

77

Patrón STRATEGY

Clase Cliente

….

Clase StrConcr1

operac()

….

Interfaz Strategy

operac()….

usa

….

0..11

Clase StrConcr2

operac()

….La clase Cliente necesita ejecutar un método: operac(),que puede ser implementado siguiendo distintosalgoritmos. Se pueden implementar todos ellos (en las

clases StrConcrX) y ser trasparente a Cliente.

Patrón STRATEGY

Page 78: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 78/82

78

Implementación

class Cliente {Strategy s;

 // PARA SELECCIONAR EL ALGORITMO

 // SE ASIGNA A s LA INSTANCIA // DE LA SUBCLASE QUE LO IMPLEMENTA

Cliente(Strategy str) {s = str;}

 // EL Cliente SIEMPRE SE EJECUTARÁ ASÍ:s.operac(); }

Cliente c = new Cliente(new StrConcr1());

Se indica cuál es el algoritmo que se ejecutará

Patrón STRATEGY

Page 79: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 79/82

79

Implementación

class Cliente { // EN VEZ DE:

if (cond1) operac1();

else if (cond2) operac2();

else ...

}

• Sentencias condicionales para seleccionar el algoritmo

• Si se quisiera añadir una nueva forma de ejecutaroperac() entonces HABRÍA QUE CAMBIAR EL

CÓDIGO DE LA CLASE Cliente

Patrón ITERATOR

Page 80: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 80/82

80

• Intención: – Proporcionar una forma de acceder a los

elementos de una colección de objetos de manerasecuencial sin revelar su representación interna.

Define una interfaz que declara métodos paraacceder secuencialmente a la colección.

• Ventajas:

 – La clase que accede a la colección solamente a

través de dicho interfaz permanece independientede la clase que implementa la interfaz.

Patrón ITERATOR

Patrón ITERATOR

Page 81: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 81/82

81

Cliente

IteradorConcreto

Interfaz Iterador 

hasNextItem()getNextItem()

Interfaz Agregado 

CrearIterador() : Iterador 

AgregadoConcreto

CrearIterador() : IteradorhasNextItem()getNextItem()

♦Participantes

♦Iterador: define una interfaz para acceder a los elementos delagregado y recorrerlos

♦IteradorConcreto: implementa la interfaz de Iterador y mantienela posición actual del recorrido

♦ Agregado: define una interfaz para crear un objeto iterador

♦ AgregadoConcreto: implementa la interfaz de creación del iterador

para devolver una instancia apropiada de IteradorConcreto

return new IteradorConcreto(this);

Patrón ITERATOR

Patrón ITERATOR

Page 82: 06Patrones

5/10/2018 06Patrones - slidepdf.com

http://slidepdf.com/reader/full/06patrones 82/82

• Ejemplos en Java:

Patrón ITERATOR

Vector listOfStudents = new Vector(); // PARA RECORRER EL VECTOR:

Enumeration list = listOfStudents.elements();while ( list.hasMoreElements() )

System.out.println( list.nextElement() );

Hashtable anIndex = new Hashtable();

 // PARA RECORRER LA TABLA HASH:

Enumeration list = anIndex.keys();while ( list.hasMoreElements() )