Documentos de Académico
Documentos de Profesional
Documentos de Cultura
06 Patrones
06 Patrones
Patrones de Diseo
Introduccin
El diseo OO es difcil y el diseo de software
orientado a objetos reutilizable lo es an ms.
Los diseadores expertos no resuelven los
problemas desde sus principios; reutilizan
soluciones que han funcionado en el pasado.
Se encuentran patrones de clases y objetos de
comunicacin recurrentes en muchos sistemas
orientados a objetos.
Estos patrones resuelven problemas de diseo
especficos y hacen el diseo flexible y reusable.
2
Definicin de un patrn
Alexander(arquitecto/urbanista)
Introduccin
Elementos de un patrn
Nombre: describe el problema de diseo.
El problema: describe cundo aplicar el
patrn.
La solucin: describe los elementos que
componen el diseo, sus relaciones,
responsabilidades y colaboracin.
Ms informacin en...
Creacin
Estructural
Comportamiento
Adapter
Interpreter
Template Method
mbito
Clase
Factory Method
Adapter
Abstract Factory
Objeto
Builder
Prototype
Singleton
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Chain of Responsability
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor
DELEGATION
INTERFACE
MARKER INTERFACE
10
Patrn DELEGATION
Utilidad:
Cuando se quiere extender y reutilizar la
funcionalidad de una clase SIN UTILIZAR LA
HERENCIA
Ventajas:
En vez de herencia mltiple
Cuando una clase que hereda de otra quiere
ocultar algunos de los mtodos heredados
Compartir cdigo que NO se puede heredar
11
Patrn DELEGATION
El problema
Clase A
Clase B
a1()
.
b1(),b2()
.
Clase C
a1(), b1(), b2()
.
- El lenguaje utilizado NO PERMITE HERENCIA MLTIPLE
- La clase C no desea TODOS los mtodos de B
12
Patrn DELEGATION
La solucin
Clase A
Clase B
a1()
.
b1(), b2()
.
usa
Clase C
a1(), b1()
.
NO USAR HERENCIA
SINO LA RELACIN USA
13
Patrn DELEGATION
Implementacin
class C extends A {
B objB;
C ( ) { // En la constructora se puede crear obj. de B
objB=new B();
}
void b1( ) { objB.b1( );}
.
14
Patrn INTERFACE
Utilidad y Ventajas
Utilidad
Definir un comportamiento independiente de
donde vaya a ser utilizado
Ventajas
Desacople entre comportamiento y clase.
Realizacin de clases Utilities
15
Patrn 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
Patrn INTERFACE
La solucin
Clase Utilities
ImprimirEstructura(Recorrible o)
usa
Interfaz Recorrible
irAlPrimero(),
tieneElems(),
obtenerSiguiente().
implementa
Clase A
irAlPrimero(),
tieneElems(),
obtenerSiguiente().
Patrn INTERFACE
Implementacin
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
Patrn INTERFACE
Ejemplo
Uso de
countIf
Utilidad
Sirve para indicar atributos semnticos 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
usa
Interfaz Marker
operacion(Object o)
.
Clase Marcada
m1()
.
Clase NoMarcada
nm1()
.
21
22
Creacin
Estructural
Comportamiento
Adapter
Interpreter
Template Method
mbito
Clase
Factory Method
Adapter
Abstract Factory
Objeto
Builder
Prototype
Singleton
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Chain of Responsability
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor
23
Patrn 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 slo se instancie
una vez
24
Patrn SINGLETON
La solucin
El constructor de la clase DEBE SER PRIVADO
Se proporciona un mtodo ESTTICO en la clase que devuelve
LA NICA INSTANCIA DE LA CLASE:
getInstance()
Clase CSingleton
- CSingleton laInstancia
.
- CSingleton ()
+ getInstance ()
Mtodo
static
- indica que es private
Atributos
Mtodos
Patrn SINGLETON
Implementacin
Patrn SINGLETON
Inconvenientes
29
Clase A
If (tipo==1)
create A
else
create A
oper1()
oper2()
...
Programa2
Clase A
oper1()
oper2()
...
Clase A
oper1()
oper2()
...
If (tipo==1)
create A
else
create A
30
Clase A
A.create(1);
oper1()
oper2()
static A create(tipo)
Programa2
A.create(2)
Clase A
oper1()
oper2()
...
Clase A
oper1()
oper2()
...
31
Interfaz A
Clase CFactory
oper1()
oper2()
...
Clase A1
oper1()
oper2()
...
A create(tipo)
Clase A2
oper1()
oper2()
...
Creacin
Estructural
Factory Method
Adapter
Comportamiento
mbito
Clase
Adapter
Abstract Factory
Objeto
Builder
Prototype
Singleton
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Interpreter
Template Method
Chain of Responsability
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor
35
Patrn ADAPTER
Intencin
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 cdigo no orientado a objeto con forma de
clase
36
Patrn ADAPTER
El problema
Clase A
ejec(Interfaz C)
Clase B
b1(.)
b2(.)
.
usa
Interfaz C
m1(.)
m2(.)
.
Patrn ADAPTER
La solucin
Clase A
ejec(Interfaz C)
Clase B
b1(.)
b2(.)
.
Interfaz C
usa
usa
m1(.)
m2(.)
.
Clase AdapterB
AdapterB(B)
m1(.)
m2(.)
.
Solucin: construir una clase Adaptadora de B que implemente la
interfaz C. Al implementarla, usa un objeto de B y sus mtodos
Para utilizar la clase A:
objetoDeAdapterB =NEW AdapterB(objetoDeB)
38
objetoDeA.ejec(objetoDeAdapterB)
Patrn ADAPTER
Diagrama de interaccin
: Cliente
ab: AdapterB
a:A
new AdapterB(b)
ab
ejec(ab)
m1(...)
b1()
b:B
m2(...)
b2()
El cliente quiere usar el objeto a (para que ejecute el
mtodo ejec) con un objeto de b. Para ello necesita
crear un objeto adaptador que encapsule b
39
Patrn 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 mtodos
b1(),b2()) los convierte/adapta a los
mtodos esperados por la clase A
(mtodos m1(),m2(),)
40
Patrn ADAPTER
Ejemplo de uso en JGL
Clase Sorting
sort(Sequence)
De JGL
usa
De Java
Interfaz Sequence
add, clear, isEmpty,
size. (de Container)
at, put, contains, ...
usa
Clase IntArray
IntArray(int [] )
Implementa: add,
clear, isEmpty, size..
Patrn ADAPTER
Ejemplo I
class WhatIUse {
public void op(WhatIWant wiw)
{ wiw.f();} }
class WhatIHave {
public void g() {}
public void h() {} }
interface WhatIWant
{ void f(); }
Patrn ADAPTER
Ejemplo II
Mover( )
Move( )
Polgono
Cuadrado
Crculo
Texto
Dibujar( )
Dibujar( )
Dibujar( )
Dibujar( )
Mover( )
Mover( )
Mover( )
Mover( )
43
Patrn COMPOSITE
Intencin
Componer objetos en jerarquas 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 cdigo de los clientes, que slo usan una interfaz
Facilita aadir nuevos componentes sin afectar a los clientes
Inconvenientes
Es difcil restringir los tipos de los hijos
Las operaciones de gestin de hijos en los objetos simples pueden
presentar problemas: seguridad frente a flexibilidad
44
Patrn COMPOSITE
El problema: La escalabilidad
Documento
Pgina
Columna
Marco
Imagen
LneaDeTexto
Carcter
Un documento est formado por varias pginas, las cuales estn formadas por columnas que
contienen lneas de texto, formadas por caracteres.
Las columnas y pginas pueden contener marcos. Los marcos pueden contener columnas.
Las columnas, marcos y lneas de texto pueden contener imgenes.
45
Patrn COMPOSITE
La solucin
ElementoDeDocumento
Carcter
Documento
Imagen
Pgina
0..n
ElemDeDocCompuesto
Columna
Marco
LneaDeTexto
Un documento est formado por varias pginas, las cuales estn formadas por
columnas que contienen lneas de texto, formadas por caracteres.
Las columnas y pginas pueden contener marcos. Los marcos pueden
contener columnas.
Las columnas, marcos y lneas de texto pueden contener imgenes. 46
Patrn COMPOSITE
La solucin
Cliente
Componente
Operacin()
unCompuesto
m_hijo
unSimple
Simple
Operacin()
unSimple
unCompuesto
Compuesto
Operacin()
Add(c : Componente)
Remove(c : Componente)
Iterar() : Componente
unSimple
unSimple
unSimple
Participantes
Componente: declara una clase abstracta para la composicin de objetos,
Simple: representa los objetos de la composicin 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 composicin mediante la interfaz de Componente
47
Patrn COMPOSITE
Ejemplo: La jerarqua de clases de AWT
48
Patrn COMPOSITE
Ejemplo: La jerarqua de clases de AWT
COMPONENTE
Applet
CONTENEDOR
(todo contenedor es
un componente)
Patrn COMPOSITE
Un diseo francamente malo
Button
*
*
CheckBox
TextField
Frame
*
Applet
JWindow
JDialog
JApplet
JComponent
JFrame
JPanel JList JComboBox
JMenuBar
JTextField,
JTextArea,
JButton
51
Patrn FACADE
Intencin: El patrn 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. Slo hay que
realizar los cambios necesarios en FACADE
52
Patrn FACADE
El problema
Clases SERVIDORAS
Clase B
usa
Clase CLIENTE
Clase A
a1()
.
Clase C
usa
b1()
.
c1()
.
usa
Clase D
d1()
.
53
Patrn FACADE
El problema
Clases CLIENTES
Clase CLI1
cl11()
.
Clase CLI2
cl21()
.
Clase CLI3
usa
usa...
cl31()
.
Problema: Adems puede haber
muchas clases cliente...
Clases SERVIDORAS
Clase B
b1()
.
Clase C
c1()
.
Clase D
d1()
.
54
Patrn FACADE
La solucin
Clases CLIENTES
Clase CLI1
cl11()
usa
.
usa
Clase CLI2
Clase Facade
cl21()
b1(), c1(), d1(),..
.
Clase CLI3
cl31()
.
Solucin: Proporcionar una clase que
implemente todos los servicios (b1()).
Los clientes slo usarn dicha clase.
Clases SERVIDORAS
Clase B
b1()
.
Clase C
c1()
.
Clase D
d1()
.
55
Patrn FACADE
Ejemplo: Estructurar un entorno de programacin
Linkador
Editor
Depurador
Compilador
Compilar()
Clases del
subsistema de
compilacin
AnaSin
ASA
AnaLex
TabSim
Token
56
Creacin
Estructural
Factory Method
Adapter
Comportamiento
mbito
Clase
Adapter
Abstract Factory
Objeto
Builder
Prototype
Singleton
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Interpreter
Template Method
Chain of Responsability
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor
57
Patrn OBSERVER
Intencin
Definir una dependencia 1:n de forma que
cuando el objeto 1 cambie su estado, los n
objetos sean notificados y se actualicen
automticamente
Motivacin
En un toolkit de GUI, separar los objetos
de presentacin (vistas) de los objetos de
datos, de forma que se puedan tener
varias vistas sincronizadas de los mismos
datos (editor-subscriptor)
58
Patrn OBSERVER
Ejemplo
observadores
notificacin de cambio
peticiones, modificaciones
a = 50%
b = 30%
c = 20%
sujeto
59
Patrn OBSERVER
La solucin
Se implementa
aadiendo el atributo
Vector susObservers
en Subject
Clase OBSERVADA
(Modelo)
Clases OBSERVADORAS
susObservers (Vistas)
Class Observable
addObserver(Observer)
removeObserver(Observer)
notifyObservers()
setChanged()
Interfaz Observer
0..*
Class ObsConcreto
Clase ObsConcreta
set(...){
// call notifyObservers()}
get() {...}
.....
update()
.
suSubject
1
Se implementa
aadiendo el atributo
Observable suSubject
en ObsConcreta
update() {
// Qu hacer cuando
// cambie el objeto
// observado suSubject
// Llamar: suSubject.get()
60
} ...
Patrn OBSERVER
Diagrama de interaccin
s: Observable
set(...)
Se cambia algn
valor de s
oi: Observer
addObserver(oi)
Registrarse como
observador de s
setChanged()
notityObservers()
update()
get(...)
Llama a update()
para cada objeto
de susObservers
actualizarse con los
nuevos valores de s
61
Patrn OBSERVER
La clase Observable
Mtodos
addObserver (o)
deleteObserver(o)
deleteObservers
countObservers
setChanged()
hasChanged
Significado
Aade un nuevo observador o
Elimina el observador o
Elimina todos los observadores
Devuelve el nmero de observadores
marca el objeto como modificado
Devuelve cierto si el objeto esta modificado
notifyObservers
La interfaz Observer
update()
Patrn OBSERVER
Otro Ejemplo
http://csis.pace.edu/~bergin/mvc/mvcgui.html
63
Patrn OBSERVER
Ejemplo: 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;
}
64
Patrn OBSERVER
Ejemplo: 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());
}
}
65
Patrn OBSERVER
Ejemplo: El programa principal
66
OBSERVABLE
OBSERVER
67
...
public class ObserverQuePinta extends Frame
implements Observer{
VISTA
Label label1 = new Label();
Panel panel1 = new Panel();
Observable suSubject;
public interface Observer {
void update();
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);
}}
68
MODELO
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();}
}
69
Patrn OBSERVER
Inicializacin
Patrn OBSERVER
Adaptabilidad de la solucin
...
public class ObserverQueEscribeNums extends Frame
implements Observer{
Label label1 = new Label();
TextArea textArea1 = new TextArea();
Subject suSubject;
public ObserverQueEscribeNums(Subject s) {
suSubject = s;
public interface Observer {
s.addObserver(this); ... }
void notificar();
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");
}}
72
EXTENDER CON UN NUEVO OBSERVER
...
CAMBIAR DE SUBJECT
public class Subject extends Frame {
Checkbox checkbox1 = new Checkbox();
Checkbox checkbox2 = new Checkbox(); // ... y checkbox3
CheckboxGroup 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();} } 73
74
Patrn STRATEGY
Intencin:
Encapsular algoritmos relacionados en
clases y hacerlos intercambiables.
Se permite que la seleccin del algoritmo
se haga segn el objeto que se trate.
Ventajas
Se permite cambiar el algoritmo
dinmicamente
Se eliminan sentencias condicionales para
seleccionar el algoritmo deseado
75
Patrn STRATEGY
La solucin
SistemaLineal
MtodoResolucin
...
Resolver ()
...
Resolver()
instancia->Resolver();
MtodoResolucin1
MtodoResolucin2
MtodoResolucin3
Resolver ()
Resolver ()
Resolver ()
76
Patrn STRATEGY
Interfaz Strategy
Clase Cliente
usa
.
Clase StrConcr1
0..1
operac()
.
Clase StrConcr2
operac()
operac()
.
.
La clase Cliente necesita ejecutar un mtodo: operac(),
que puede ser implementado siguiendo distintos
algoritmos. Se pueden implementar todos ellos (en las
clases StrConcrX) y ser trasparente a Cliente.
77
Patrn STRATEGY
Implementacin
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 cul es el algoritmo que se ejecutar
78
Patrn STRATEGY
Implementacin
class Cliente {
// EN VEZ DE:
if (cond1) operac1();
else if (cond2) operac2();
else ...
}
Sentencias condicionales para seleccionar el algoritmo
Si se quisiera aadir una nueva forma de ejecutar
operac() entonces HABRA QUE CAMBIAR EL
CDIGO DE LA CLASE Cliente
79
Patrn ITERATOR
Intencin:
Proporcionar una forma de acceder a los
elementos de una coleccin de objetos de manera
secuencial sin revelar su representacin interna.
Define una interfaz que declara mtodos para
acceder secuencialmente a la coleccin.
Ventajas:
La clase que accede a la coleccin solamente a
travs de dicho interfaz permanece independiente
de la clase que implementa la interfaz.
80
Patrn ITERATOR
Interfaz Agregado
CrearIterador() : Iterador
Cliente
AgregadoConcreto
CrearIterador() : Iterador
Interfaz Iterador
hasNextItem()
getNextItem()
IteradorConcreto
hasNextItem()
getNextItem()
Participantes
Iterador: define una interfaz para acceder a los elementos del
agregado y recorrerlos
IteradorConcreto: implementa la interfaz de Iterador y mantiene
la posicin actual del recorrido
Agregado: define una interfaz para crear un objeto iterador
AgregadoConcreto: implementa la interfaz de creacin del iterador
81
para devolver una instancia apropiada de IteradorConcreto
Patrn ITERATOR
Ejemplos en Java:
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() )
System.out.println( list.nextElement() );
82