0% encontró este documento útil (0 votos)
81 vistas59 páginas

S17.s01 - Patrones en Java

Este documento describe los patrones de diseño en Java, incluyendo los patrones GoF y clasificaciones como creación, estructurales y de comportamiento. También cubre patrones fundamentales como delegación, interfaz y marcador de interfaz.

Cargado por

lest doit
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
81 vistas59 páginas

S17.s01 - Patrones en Java

Este documento describe los patrones de diseño en Java, incluyendo los patrones GoF y clasificaciones como creación, estructurales y de comportamiento. También cubre patrones fundamentales como delegación, interfaz y marcador de interfaz.

Cargado por

lest doit
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 59

Curso: Programación Orientada a

Objetos
Unidad III:
Conceptos avanzados de programación orientada a objetos

Sesión 17:
Patrones en Java

Docente: Ing. Marcelino Estrada Aro


[email protected]
985474457
Indicador de logro de la unidad III

Al finalizar la unidad, el estudiante soluciona problemas


aplicando los conceptos de clases genéricas y colecciones y
patrones usando Java
Indicador de logro de la sesión

Al finalizar la sesión, el estudiante identifica los patrones


en Java.
Importancia

Esta sesión, permitirá que el alumno desarrolle programas


con los paradigmas de la programación orientada a objetos
Sesión 17: Contenido General

1. Patrones en Java
2. Patrones GoF
3. Clasificación de patrones
4. Patrones por propósito
5. Patrones por ambito
6. Ejercicios de desarrollo
Recordando…

¿ Objetos Persistentes?
¿ Persistencia?

¿Archivos?

6
Introducción

• El diseño OO es difícil y el diseño de software


orientado a objetos reutilizable lo es aún más.
• Los diseñadores expertos no resuelven los
problemas desde sus principios; reutilizan
soluciones 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ño
específicos y hacen el diseño flexible y reusable.

7
Definición de un patrón

Cada patrón describe un problema que


ocurre una y otra vez en nuestro
entorno y describe también el núcleo de
la solución al problema, de forma que
puede utilizarse un millón de veces sin
tener que hacer dos veces lo mismo.

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

Un patrón de diseño es una descripción


de clases y objetos comunicándose
entre sí adaptada para resolver un
problema de diseño general en un
contexto particular.

9
Introducción

• Es un tema importante en el desarrollo de


software actual: permite capturar la experiencia
• Busca ayudar a la comunidad de desarrolladores
de 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)

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

1
1
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 clases
y/o objetos.
– De comportamiento: caracterizan las formas en
las que interactúan y reparten responsabilidades
las distintas clases u objetos.

1
2
Clasificación de los patrones
GoF (gang of Four) [Gamma]
Propósito
Creación Estructural Comportamiento
Ámbito
 Factory Method  Adapter Interpreter
Clase Template Method

 Adapter Chain of Responsability


Command
Abstract Factory

Bridge
Composite
 Iterator
Builder Mediator
Objeto Decorator Memento
Prototype  Facade
 Observer
 Singleton Flyweight State
Proxy  Strategy
Visitor

9
Además: PATRONES DE DISEÑO FUNDAMENTALES
Patrones de diseño fundamentales

Son patrones que no aparecen la tabla definida


por Gamma, pero se utilizan habitualmente:
• DELEGATION
• INTERFACE
• MARKER INTERFACE

14
Patrón DELEGATION

Utilidad:
Cuando se quiere extender y reutilizar la
funcionalidad de una clase SIN UTILIZAR LA
HERENCIA
Ventajas:
• En vez de herencia múltiple
• Cuando una clase que hereda de otra quiere
ocultar algunos de los métodos heredados
• Compartir código que NO se puede heredar

15
Patrón DELEGATION
El problema

Clase A Clase B
a1() 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
16
Patrón DELEGATION
La solución

Clase A Clase B
a1() b1(), b2()
…. ….

usa
Clase C
a1(), b1()
…. El método b1() habrá que
añadirlo a C

NO USAR HERENCIA
SINO LA RELACIÓN “USA” 13
Patrón DELEGATION
Implementación

class C extends A {
B objB;
C ( ) { // En la constructora se puede crear obj. de B
objB=new B();
}
void b1( ) { objB.b1( );}
….

18
Patrón INTERFACE
Utilidad y Ventajas

Utilidad
Definir un comportamiento independiente de
donde vaya a ser utilizado

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

19
Patrón INTERFACE
El 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? 16


Patrón INTERFACE
La solución

Clase Utilities Interfaz Recorrible


usa
ImprimirEstructura(Recorrible o)
irAlPrimero(),
….
tieneElems(),
obtenerSiguiente().

implementa
Clase A
irAlPrimero(),
tieneElems(),
obtenerSiguiente().

Solución: Definir los parámetros de un tipo Interfaz.


Todas las clases(instancias) que quieran utilizar ese comportamiento
deberán implementar dicho interfaz 17
Patrón INTERFACE
Implementació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; }

}
18
}
Patrón MARKER INTERFACE
Utilidad 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 de
utilidades que tienen que determinar algo
sobre objetos sin asumir que son
instancias de una determinada clase o no.
20
Patrón MARKER INTERFACE

Clase Utilidad Interfaz Marker


usa
operacion(Object o)
….

Clase Marcada Clase NoMarcada


m…1.() n…m.1()

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


clase Utilidad podemos preguntar si el objeto o es de una
clase Marker:
if (o instanceof Marker) {...}
else {...} 21
Clasificación de los patrones
GoF (gang of Four) [Gamma]
Propósito
Creación Estructural Comportamiento
Ámbito
 Factory Method  Adapter Interpreter
Clase Template Method

 Adapter Chain of Responsability


Command
Abstract Factory

Bridge
Composite
 Iterator
Builder Mediator
Objeto Decorator Memento
Prototype  Facade
 Observer
 Singleton Flyweight State
Proxy  Strategy
Visitor

25
Patrón SINGLETON

• Utilidad
– Asegurar que una clase tiene una sola instancia y
proporcionar 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

26
Patrón SINGLETON
La solución

– El constructor de la clase DEBE SER PRIVADO


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

Clase CSingleton
- CSingleton laInstancia Atributos
….
- CSingleton ()
Método + getInstance () Métodos
static
- indica que es private + indica que es public

27
Patrón SINGLETON
Implementación

public class CSingleton {


private static CSingleton laInstancia = new CSingleton();
private CSingleton() {}
public static CSingleton getInstance() {
return laInstancia;

}
………………………….
}
28
Patrón SINGLETON
Inconvenientes

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 {...}
27
public final class Facultad implements Serializable {
private Vector listaProfesores;
private Vector listaEstudiantes; EJEMPLO DE
PATRÓN
private Vector listaAsigs; SINGLETON
private Vector listaMatrs;
private static Facultad laFacultad=new Facultad();
private Facultad() // EL CONSTRUCTOR ES PRIVADO
{ listaProfesores = new Vector(); // Sólo hay UNA instancia
listaEstudiantes= 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); }
30
Patrón FACTORY METHOD

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

31
Patrón FACTORY METHOD
El problema

Programa1
Clase A If (tipo==1)
create A’
oper1()
oper2() else
... create A’’

Programa2
If (tipo==1)
Clase A’ Clase A’’ create A’
else
oper1() oper1() create A’’
oper2() oper2()
... ...

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


Patrón FACTORY METHOD
Una primera solución
Programa1
Clase A A.create(1);
oper1()
oper2()
static A create(tipo)

Programa2
A.create(2)
Clase A’ Clase A’’
oper1() oper1()
oper2() oper2()
... ...

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


Puede que no tengamos acceso al código de A 31
Patrón FACTORY METHOD
La solución final

Interfaz A
Clase CFactory
oper1() A create(tipo)
oper2() ….
...

Clase A1 Clase A2
oper1() oper1()
oper2() oper2()
... ...

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


32
las instancias se crean en una clase CFactory
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’’’, NO
NECESARIAMENTE habría que modificar la clase
Aplicación. Los tipos que CFactory puede crear los pued3e3
devolver un método y Aplicación trabajar con él.
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 clase
Aplicación
• Se pueden añadir nuevos Aes sin modificar Aplicación. Basta
con añadir la clase A3 y modificar CFactory (añadir el tipo 34
correspondiente a dicho A: “TIPOX”)
Clasificación de los patrones
GoF (gang of Four) [Gamma]
Propósito
Creación Estructural Comportamiento
Ámbito
 Factory Method  Adapter Interpreter
Clase Template Method

 Adapter Chain of Responsability


Command
Abstract Factory

Bridge
Composite
 Iterator
Builder Mediator
Objeto Decorator Memento
Prototype  Facade
 Observer
 Singleton Flyweight State
Proxy  Strategy
Visitor

37
Patrón ADAPTER

Intención
Convertir la interfaz de una clase en otra interfaz esperada por los
clientes.
Permite que clases con interfaces incompatibles se comuniquen

Ventajas
Se quiere utilizar una clase ya existente y su interfaz no se
corresponde con la interfaz que se necesita
Se quiere envolver código no orientado a objeto con forma de
clase

38
Patrón ADAPTER
El problema

Clase A usa Interfaz C


ejec(Interfaz C) m1(….)
m…2(…. .)

Clase B Se desea utilizar la clase A (el método


b1(….) ejec) utilizando como entrada un
b2…(…. .) objeto de la clase B
objetoDeA.ejec(objetoDeB)
Pero no se puede, ya que la clase B
no implementa la interfaz C
39
Patrón ADAPTER
La solución

Clase A Interfaz C
usa m1(….)
ejec(Interfaz C)
m…2(…. .)

Clase B
b1(….) usa
Clase AdapterB
b2…(…. .)
AdapterB(B)
m1(….)
m…2(…. .)
Solución: construir una clase Adaptadora de B que implemente la
interfaz C. Al implementarla, usa un objeto de B y sus métodos
Para utilizar la clase A:
objetoDeAdapterB =NEW AdapterB(objetoDeB)
40
objetoDeA.ejec(objetoDeAdapterB)
Patrón ADAPTER

• Convierte la interfaz de una clase en


otra interfaz que los clientes esperan.
Permite que clases con interfaces
incompatibles puedan ser utilizadas
conjuntamente.
– La interfaz de la clase B (los métodos
b1(),b2()…) los convierte/adapta a los
métodos esperados por la clase A
(métodos m1(),m2(),…)

40
Patrón ADAPTER
Ejemplo de uso en JGL

Clase Sorting De JGL Interfaz Sequence


usa add, clear, isEmpty,
sort(Sequence)
size. (de Container)
at, put, contains, ...
De Java
Array Java nativo: int[]
Operaciones con arrays:
usa
Clase IntArray
acceso elº i: int[i], ... IntArray(int [] )
Implementa: add,
Adapter proporcionado por JGL clear, isEmpty, size..

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


int ints[] = { 3, -1, 2, -3, 4 };
IntArray intArray = new IntArray( ints);
Sorting.sort( intArray ); 41
Patrón ADAPTER
Ejemplo II

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

Gráfico
Label
Dibujar( )
Draw( )
Mover( )
Move( )

Polígono Cuadrado Círculo Texto

Dibujar( ) Dibujar( ) Dibujar( ) Dibujar( )


Mover( ) Mover( ) Mover( ) Mover( )

43
Patrón COMPOSITE

Intención
Componer objetos en jerarquías todo-parte y permitir a los clientes
tratar 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 pueden
presentar problemas: seguridad frente a flexibilidad

44
Patrón COMPOSITE
El problema: La escalabilidad

Documento

Página

Columna Marco

Imagen
LíneaDeTexto

Carácter

Un documento está formado por varias páginas, las cuales están formadas por columnas que
contienen líneas de texto, formadas por caracteres.
Las columnas y páginas pueden contener marcos. Los marcos pueden contener columnas.
45
Las columnas, marcos y líneas de texto pueden contener imágenes.
Patrón COMPOSITE
La solución

0..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 por
columnas que contienen 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. 46
Patrón COMPOSITE
La solución

Cliente Componente
Operación() m_hijo unCompuesto

unSimple unSimple unCompuesto


Simple Compuesto
Operación() Operación()
Add(c : Componente)
Remove(c : Componente) unSimple unSimple unSimple
para cada hijo en m_hijo Iterar() : Componente
hijo->Operación();

 Participantes
 Componente: declara una clase abstracta para la composición de objetos,
Simple: representa los objetos de la composición que no tienen hijos e
implementa sus operaciones
Compuesto: implementa las operaciones para los componentes con hijos y
almacena a los hijos
 Cliente: utiliza objetos de la composición mediante la interfaz de Componente
47
Patrón COMPOSITE
Ejemplo: La jerarquía de clases de AWT

• Sirve para diseñar clases que agrupen


a objetos complejos, los cuales a su vez
están formados por objetos complejos
y/o simples

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


según el patrón COMPOSITE

48
Patrón COMPOSITE
Ejemplo: La jerarquía de clases de AWT
COMPONENTE

Applet
CONTENEDOR
(todo contenedor es
Las posibilidades son infinitas… un componente)
- Una ventana formada por 2 cajas de texto, 2 campos de texto, 3 botones, 1
panel 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 mu4y9
costoso (estaríamos ante una solución extensible)
Patrón COMPOSITE
Un diseño francamente malo …

Button *
*
CheckBox

* Frame
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 ser
componente 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) 50
Componentes principales de Swing

Applet
JComponent JMenuBar
JWindow
JFrame JTextField,
JDialog
JPanel JList JComboBox JTextArea,
JApplet JButton…

51
Patrón FACADE

Intención: El patrón FACADE simplifica el acceso a


un conjunto de clases proporcionando una única
clase que todos utilizan para comunicarse con dicho
conjunto de clases.
Ventajas
– Los clientes no necesitan conocer las clases que
hay tras la clase FACADE
– Se pueden cambiar las clases “ocultadas” sin
necesidad de cambiar los clientes. Sólo hay que
realizar los cambios necesarios en FACADE
52
Patrón FACADE
El problema

Clases SERVIDORAS
Clase B
usa b1()
Clase CLIENTE ….
Clase A Clase C
usa
a1()
…. c1()
….
usa
La clase A debe saber cuál Clase D
es exactamente la clase que
le proporciona el servicio: d1()
….
b1() es de B, c1() de C, d1()
de D, ...
…. 53
Patrón FACADE
El problema

Clases CLIENTES Clases SERVIDORAS


Clase CLI1 Clase B
usa
cl11() b1()
…. usa... ….
Clase CLI2 Clase C
cl21()
…. c1()
….
Clase CLI3
cl31() Clase D
….
d1()
Problema: Además puede haber ….
muchas clases cliente... …. 54
Patrón FACADE
La solución

public class Facade {


Clases CLIENTES Clases SERVIDORAS
B objB = new B();
Clase CLI1 C objC = new C();… Clase B
void b1() { objB.b1();}..}
cl11() usa b1()
…. usa ….
Clase CLI2 Clase C
Clase Facade
cl21()
…. b1(), c1(), d1(),.. c1()
….
Clase CLI3
cl31() Clase D
….
Solución: Proporcionar una clase que d1()
….
implemente todos los servicios (b1()…). …. 55
Los clientes sólo usarán dicha clase.
Patrón FACADE
Ejemplo: Estructurar un entorno de programación

Linkador
Editor
Depurador

Compilador

Clases del Compilar()


subsistema de
compilación

AnaSin AnaLex

ASA TabSim Token

56
Actividad Grupal
Entrega del informe preliminar para revisión y observaciones para la
exposición final de la semana 18.

57
Cierre

A. ¿Qué hemos aprendido en la clase?

B. Preguntas del tema....!!!!

58

También podría gustarte