analisis y dise Ño o.o. · patrones gof analisis y dise Ño o.o. patrones gof gof (gang of four )...
TRANSCRIPT
1
Patrones Patrones GoFGoF
ANALISIS Y DISEANALISIS Y DISEÑÑO O.O. O O.O.
Patrones Patrones GoFGoF
�� GoFGoF ((ganggang ofof fourfour))
23 patrones presentados por la 23 patrones presentados por la
““pandilla de los cuatropandilla de los cuatro”” en el en el
libro libro ““Design PatternsDesign Patterns””. Gamma, . Gamma,
Helm, Johnson, Vlissides. 1995.Helm, Johnson, Vlissides. 1995.
2
Patrones Patrones GoFGoF
�� ¿¿CCóómo usar un patrmo usar un patróón de disen de diseñño?o?
�� Conocer en gran parte la soluciConocer en gran parte la solucióón n
gengenéérica que brinda cada patrrica que brinda cada patróón y el n y el
tipo de problemtipo de problemáática que resuelventica que resuelven
�� Evaluar la posibilidad de aplicar el o los Evaluar la posibilidad de aplicar el o los
patrones en el problema patrones en el problema
correspondientecorrespondiente
�� Definir la implementaciDefinir la implementacióón de los mismos n de los mismos
en nuestro modelo. Nombre de clases, en nuestro modelo. Nombre de clases,
mméétodos y atributostodos y atributos
�� Implementar los mImplementar los méétodos todos
correspondientescorrespondientes
�� De creaciDe creacióón:n: Forma de crear Forma de crear instancias. Abstraer y ocultar cinstancias. Abstraer y ocultar cóómo mo son creados e inicializados los objetos son creados e inicializados los objetos (Factor(Factoríía (a (FactoryFactory), ), SingletonSingleton))
�� Estructurales:Estructurales: CCóómo se combinan mo se combinan clases y objetos para formar nuevas clases y objetos para formar nuevas estructuras y proporcionar nuevas estructuras y proporcionar nuevas funciones (Adaptador (funciones (Adaptador (AdapterAdapter))))
�� De comportamiento:De comportamiento: Ayudan a definir Ayudan a definir la comunicacila comunicacióón e interaccin e interaccióón de los n de los objetos. Reducir acoplamiento objetos. Reducir acoplamiento ((ObserverObserver).).
Patrones Patrones GoFGoF
3
Patrones G o FPatrones G o F
�� Patrones de Patrones de CreaciCreacióónn
�� AbstractAbstract FactoryFactory
�� FactoryFactory MethodMethod
�� SingletonSingleton
�� Patrones EstructuralesPatrones Estructurales
�� CompositeComposite
�� AdapterAdapter
�� Patrones de ComportamientoPatrones de Comportamiento
�� ObserverObserver
Patrones De creaciPatrones De creacióónn
� Separan la forma en que se crean los objetos, para tratar las clases a crear de forma genérica.
� Se ocultan los métodos y clases concretas de tal forma que al variar su implementación no se vea afectado el resto de la aplicación.
4
� Se encarga de centralizar el sitio donde se
crean los objetos, normalmente donde se crean
objetos de una misma "familia“.
� La clase factoría devuelve una instancia de
un objeto según los datos que se le pasan como
parámetros.
� Su propósito es definir una interface para crear
objetos donde se delega la creación de las instancias
a las subclases.
FactoriaFactoria ((FactoryFactory))
Motivación:
� Un sistema debe ser independiente de cómo se
crean, componen y representan sus productos
� Un sistema debe ser configurado con una familia
de productos
� Una familia de objetos relacionados está
diseñada para ser usada conjuntamente, y es
necesario hacer cumplir esta restricción.
� Quiere proporcionar una biblioteca de clases, y
sólo quiere revelar sus interfaces, no sus
implementaciones.
FactoriaFactoria ((FactoryFactory))
5
� Una clase C cliente de una clase abstracta A
necesita crear instancias de subclases de A que no
conoce Clase A
FactoriaFactoria ((FactoryFactory))
MiDocumento
Documento
open()close()save()revert()
<<abstract>>
Aplicacion
crearDocumento()
nuevoDocumento()
openDocumento()
<<abstract>>
MiAplicacion
crearDocumento()
return new MiDocumento
Documento dd = crearDocumento();
setDoc.add(d);d.open()
“método factoria”
Clase C
setDoc
Ejemplo del patrón
Factory Method
�� AplicabilidadAplicabilidad�� Una clase no puede anticipar la clase de Una clase no puede anticipar la clase de
objetos que debe crear.objetos que debe crear.
�� Una clase desea que sus subclases Una clase desea que sus subclases especifiquen los objetos que debe crear.especifiquen los objetos que debe crear.
Linea
crearManipulador()
Circulo
crearManipulador()
ManipuladorLinea ManipuladorCirculo
Manipulador
downClick()drag()upClick()
<<abstract>>
ClienteFigura
crearManipulador()
<<abstract>>
FactoriaFactoria ((FactoryFactory))
Ejemplo del patrón
Abstract Factory
6
�� ImplementaciImplementacióónn�� Dos posibilidadesDos posibilidades
�� CreadorCreador es una clase abstracta con un es una clase abstracta con un mméétodo factortodo factoríía abstracto.a abstracto.
�� CreadorCreador es una clase concreta que es una clase concreta que ofrece una implementaciofrece una implementacióón por defecto n por defecto del mdel méétodo factortodo factoríía.a.
�� El mEl méétodo factortodo factoríía puede tener un a puede tener un parparáámetro que identifica a la clase metro que identifica a la clase del objeto a crear.del objeto a crear.
FactoriaFactoria ((FactoryFactory))
ProgramaPrograma
public abstract Figura
{
int lado = 0;
public Figura (int lado)
{
this.lado = lado;
}
public abstract int getArea ();
public abstract void dibujar (Graphics g, int x, int y);
}
FactoriaFactoria ((FactoryFactory))
7
public Circulo
{
public Circulo (int lado)
{
super (lado);
}
public int getArea ()
{
return (Math.PI x lado x lado);
}
public void dibujar (Graphics g, int x, int y)
{
g.setColor (Color.black);
g.setDrawArc (x, y, lado, lado, 0, 360);
}
}
public Cuadrado
{
public Cuadrado (int lado)
{
super (lado);
}
public int getArea ()
{
return (lado x lado);
}
public void dibujar (Graphics g, int x, int y)
{
g.setColor (Color.black);
g.setDrawRect (x, y, lado, lado);
}
}
FactoriaFactoria ((FactoryFactory))
public void FactoriaDeFiguras
{
public static final int CUADRADO = 0
public static final int CIRCULO = 1
public Figura getFigura (int tipo, int lado)
{
if (tipo == this.CUADRADO)
{
return (new Cuadrado (lado))
}
else
{
return (new Circulo (lado))
}
}
}
FactoriaFactoria ((FactoryFactory))
8
�� Ventajas: Ventajas: �� AislaAisla las clases concretas para el clientelas clases concretas para el cliente
�� Facilita el intercambio entre familias de Facilita el intercambio entre familias de
claseclase
�� Promueve la consistenciaPromueve la consistencia
�� Desventajas:Desventajas:�� No es sencillo agregar elementos a la No es sencillo agregar elementos a la
factorfactoríía.a.
�� Requiere modificar la Requiere modificar la interfaceinterface
�� Requiere modificar las subclasesRequiere modificar las subclases
FactoriaFactoria ((FactoryFactory))
Patrones Patrones GoFGoF
�� AbstractAbstract FactoryFactory
Este patrEste patróón proporciona una n proporciona una
interfaceinterface para crear familias de para crear familias de
objetos relacionados o objetos relacionados o
dependientes sin especificar sus dependientes sin especificar sus
clases concretas.clases concretas.
9
AbstractAbstract FactoryFactory
�� Se utiliza Se utiliza cuandocuando……
�� Un sistema deberUn sistema deberíía ser independiente de a ser independiente de
ccóómo sus productos son creados, mo sus productos son creados,
compuestos o representados.compuestos o representados.
�� Un sistema serUn sistema seríía configurado con uno de a configurado con uno de
sus msus múúltiples familias de productos.ltiples familias de productos.
�� Se necesita proveer una librerSe necesita proveer una libreríía de clases a de clases
de productos y se desea mostrar sus de productos y se desea mostrar sus
interfaces, no sus implementaciones.interfaces, no sus implementaciones.
�� Se necesita que un conjunto de productos Se necesita que un conjunto de productos
relacionados sean utilizados juntos. relacionados sean utilizados juntos.
AbstractAbstract FactoryFactory
�� La estructura tLa estructura tíípica es:pica es:�� AbstractAbstract FactoryFactory: Definici: Definicióón de n de
interfaces para la familia de productos interfaces para la familia de productos gengenééricosricos
�� Concrete Concrete FactoryFactory: : ImplementaciImplementacióón de n de las interfaces de los productos para las interfaces de los productos para cada una de las familias concretascada una de las familias concretas
�� AbstractAbstract ProductProduct: : DefiniciDefinicióón de los n de los mméétodos de creacitodos de creacióón genn genééricos en la ricos en la interfaceinterface de la fde la fáábrica. (retornan las brica. (retornan las interfaces geninterfaces genééricas)ricas)
�� Concrete Concrete ProductProduct: : ImplementaciImplementacióón de n de una funa fáábrica para cada una de las brica para cada una de las familias concretas.familias concretas.
10
AbstractAbstract FactoryFactory
�� Estructura tEstructura tíípicapica Abstract Factory
Concrete Factory
Abstract
Product
Concrete Product
AbstractAbstract FactoryFactory
�� Ventajas y DesventajasVentajas y Desventajas�� AislaAisla las Clases concretas: El cliente las Clases concretas: El cliente
manipula instancias a travmanipula instancias a travéés de las s de las interfaces abstractas.interfaces abstractas.
�� Facilita el intercambio de familias de Facilita el intercambio de familias de productos: Se puede cambiar la productos: Se puede cambiar la configuraciconfiguracióón de un producto simplemente n de un producto simplemente cambiando la cambiando la factoriafactoria concreta.concreta.
�� Promueve la consistencia entre productos: Promueve la consistencia entre productos: Cuando los objetos de una familia trabajan Cuando los objetos de una familia trabajan juntos, la aplicacijuntos, la aplicacióón que los usa debe utilizar n que los usa debe utilizar la misma familiala misma familia
�� Es difEs difíícil manejar nuevas clases de cil manejar nuevas clases de productos: Implica cambios en la clase productos: Implica cambios en la clase AbstractAbstract FactoryFactory..
11
Patrones Patrones GoFGoF
�� FactoryFactory MethodMethod
Define una Define una interfaceinterface para crear un para crear un
objeto, pero deja a las subclases objeto, pero deja a las subclases
decidir qudecidir quéé clase clase instanciarinstanciar..
�� Se usa cuando:Se usa cuando:
�� Una clase no puede anticipar la clase de Una clase no puede anticipar la clase de
objetos que debe crear.objetos que debe crear.
�� Una clase quiere que sus subclases Una clase quiere que sus subclases
especifiquen las clases que ella debe especifiquen las clases que ella debe
crear.crear.
FactoryFactory MethodMethod
�� Utiliza una clase constructora (al Utiliza una clase constructora (al
estilo del estilo del AbstractAbstract FactoryFactory) abstracta ) abstracta
con unos cuantos mcon unos cuantos méétodos definidos todos definidos
y y otro(sotro(s) ) abstracto(sabstracto(s): el dedicado a ): el dedicado a
la construccila construccióón de objetos de un n de objetos de un
subtipo de un tipo determinado.subtipo de un tipo determinado.
�� Las clases principales en este Las clases principales en este
patrpatróón son el creador y el producto.n son el creador y el producto.
12
FactoryFactory MethodMethod
�� El creador necesita crear instancias de productos, El creador necesita crear instancias de productos,
pero el tipo concreto de producto no debe ser pero el tipo concreto de producto no debe ser
forzado en las subclases del creador, porque forzado en las subclases del creador, porque
entonces las posibles subclases del creador entonces las posibles subclases del creador
deben poder especificar subclases del producto deben poder especificar subclases del producto
para utilizar.para utilizar.
FactoryFactory MethodMethod
MiDocumento
Documento
open()close()save()revert()
<<abstract>>
Aplicacion
crearDocumento()
nuevoDocumento()
openDocumento()
<<abstract>>
MiAplicacion
crearDocumento()
return new MiDocumento
Documento dd = crearDocumento();
setDoc.add(d);d.open()
“método factoria”
Clase C
setDoc
Ejemplo del patrón
Factory Method
Clase A
13
FactoryFactory MethodMethod
�� Una desventaja es tener que crear una Una desventaja es tener que crear una
subclase de la clase subclase de la clase CreatorCreator ssóólo para lo para
crear un objeto de la clase crear un objeto de la clase
ConcreteProductConcreteProduct
Product
ConcretProduct
Creator
FactoryMethod()
AnOperation()
ConcreteCreator
FactoryMethod()
AnOperation()
…
Product=FactoryMethod()
…
return new ConcreteProduct
FactoryFactory MethodMethod
// Definimos la clase abstracta // Definimos la clase abstracta CreatorCreator
publicpublic abstractabstract classclass CreatorCreator{ {
// Operaci// Operacióón que realiza n que realiza
publicpublic voidvoid anOperationanOperation()(){ {
ProductProduct aProductaProduct = = factoryMethodfactoryMethod()(); ;
} }
// Definimos m// Definimos méétodo abstracto todo abstracto
protectedprotected abstractabstract ProductProduct factoryMethodfactoryMethod()(); ;
} }
14
FactoryFactory MethodMethod
//Ahora definimos el creador concreto.//Ahora definimos el creador concreto.
publicpublic classclass ConcreteCreatorConcreteCreator extendsextends CreatorCreator{ {
protectedprotected ProductProduct factoryMethodfactoryMethod()() { {
returnreturn newnew ConcreteProductConcreteProduct()(); ; } }
} }
//Y definimos el producto y su implementaci//Y definimos el producto y su implementacióón concreta.n concreta.
publicpublic interfaceinterface ProductProduct{ { StringString hacer(); hacer();
} }
publicpublic classclass ConcreteProductConcreteProduct implementsimplements ProductProduct{ { ……
} }
FactoryFactory MethodMethod
//Y un ejemplo de //Y un ejemplo de usouso ::
publicpublic staticstatic voidvoid main(main(StringString argsargs[]){ []){
CreatorCreator aCreatoraCreator; ;
aCreatoraCreator = = newnew ConcreteCreatorConcreteCreator(); ();
aCreator.anOperationaCreator.anOperation(); ();
} }
15
Patrones Patrones GoFGoF
�� SingletonSingleton
� Asegura que sólo se cree una instancia de la clase
y provee un punto global de acceso a ésta.
�Este patrón es útil cuando se quiere tener solamente
un objeto único instanciado (Ej: Cola de impresión,
Conexión a BD, etc).
� Cuenta con un método o propiedad compartida
(shared) que se encarga de regresar la clase
instanciada.
� El constructor de la clase debe ser privado para
evitar que se creen instancias de la clase.
� Dentro de la clase tendremos nuestra instancia viva.
SingletonSingleton
16
return unicaInstancia
Singleton
unicaInstanciadatoSingleton
instancia()operacionSingleton()
getSingleton()
SingletonSingleton
final class Coche {
/* la única instancia de coche que se permitirá.
No es obligatorio crear el Singleton estáticamente,
se podría proveer un método que lo cree */
private static Coche c = new Coche();
// atributos
private Motor motor = new Motor();
. . .
//constructor privado para que no se pueda instanciar
private Coche(){}
//vacío porque creamos la instancia estáticamente
// método que devuelve el "singleton" Coche
public static Coche getCoche () {
return c;
}
// resto de métodos
public void acelerar() {
// implementación del metodo
}
SingletonSingleton
17
class ClaseSingletonEjemplo {
static ClaseSingletonEjemplo unicaInstancia;
public static ClaseSingletonEjemplo Instance(){
if (unicaInstancia == null)
unicaInstancia = new ClaseSingletonEjemplo();
return unicaInstancia;
}
private ClaseSingletonEjemplo(){}
};
SingletonSingleton
Patrones Patrones GoFGoF
�� CompositeComposite
�� Compone objetos en estructuras Compone objetos en estructuras
arborescentes para representar arborescentes para representar
jerarqujerarquíías TODOas TODO--PartesPartes
�� Permite manejar indistintamente Permite manejar indistintamente
objetos individuales y objetos individuales y
composiciones de objetoscomposiciones de objetos
18
CompositeComposite
Cliente Componente
Operación()
Adicionar(Componente)
Remover(Componente)
obtenerHijo(int)
Hoja
Operación()
Composite
Operación()
Adicionar(Componente)
Remover(Componente)
obtenerHijo(int)
hijos
Para todo g en hijos:
g.Operación()
CompositeComposite
�� La estructura tLa estructura tíípica es:pica es:�� ComponenteComponente
�� Declara la Declara la interfaceinterface para objetos en la para objetos en la composicicomposicióón y se encarga de acceder y n y se encarga de acceder y manejar sus componentes hijomanejar sus componentes hijo
�� HojaHoja�� Representa objetos hoja (sin hijos) en la Representa objetos hoja (sin hijos) en la
composicicomposicióón y define un comportamiento n y define un comportamiento especespecíífico fico
�� CompositeComposite�� Almacena componentes hijo y define un Almacena componentes hijo y define un
comportamiento (adicionar, eliminar, comportamiento (adicionar, eliminar, modificarmodificar……) para sus componentes hijos) para sus componentes hijos
19
CompositeComposite
ObjetoGráfico
Dibujar()
Adicionar(ObjetoGráfico)
Remover(ObjetoGráfico)
obtenerHijo(int)
Línea
Dibujar()
Texto
Dibujar()
Rectángulo
Dibujar()
Figura
Dibujar()
Adicionar(ObjetoGráfico g)
Remover(ObjetoGráfico g)
obtenerHijo(int)
elementos
En Dibujar() de figura: para todo g en el
contenedor elementos g.Dibujar()
Adicionar o remover g del contenedor elementos
Componente
Composite
Hoja Hoja Hoja
Patrones Patrones GoFGoF
�� AdapterAdapter
�� Convierte la Convierte la interfaceinterface de una de una
clase en otra clase en otra interfaceinterface que el que el
cliente esperacliente espera
�� Permite a las clases trabajar Permite a las clases trabajar
juntas ya que de otra manera no juntas ya que de otra manera no
lo podrlo podríían hacer debido a que las an hacer debido a que las
interfaces son incompatibles.interfaces son incompatibles.
20
� Se asegura de convertir la interface de una
clase en otra que el cliente espera.
� Permite la colaboración de ciertas clases a
pesar de tener interfaces incompatibles
� Se desea crear una clase reutilizable que debe
colaborar con clases no relacionadas o
imprevistas.
� La funcionalidad de Adaptador depende de la similitud entre la interfaz de las clases Objetivo y Adaptado.
Adaptador (Adaptador (AdapterAdapter//WrapperWrapper))
AdaptadorAdaptador
�� ObjetivoObjetivo�� Define la Define la interfaceinterface de dominio de dominio
especespecíífico que el cliente usafico que el cliente usa
�� ClienteCliente�� Colabora con los objetos que Colabora con los objetos que
conforman la conforman la interfaceinterface ObjetivoObjetivo
�� AdaptadoAdaptado�� Define una Define una interfaceinterface existente que existente que
necesita adaptarsenecesita adaptarse
�� AdaptadorAdaptador�� Adapta la Adapta la interfaceinterface Adaptado a la Adaptado a la
interfaceinterface ObjetivoObjetivo
21
Adaptador (Adaptador (AdapterAdapter//WrapperWrapper))
� Estructura 1: Herencia Múltiple
Interface que
el cliente
espera
Interface existente que se requiere
adaptar
Adapta la interface “Adaptee”
al “Target esperado usando
herencia múltiple
Adaptador (Adaptador (AdapterAdapter//WrapperWrapper))
� Estructura 2: Objeto Adaptador
Interface que
el cliente
espera
Interface existente
que se requiere
adaptar
Adapta la interface “Adaptee”
al “Target esperado usando
un objeto adaptador
22
AdaptadorAdaptador
Cliente Objetivo
Requerimiento()
Adaptado
RequerimientoEspecífico()
Adaptador
Requerimiento()
implementación
Realmente se invoca el
RequerimientoEspecífico()
ElemLinea
marco()crearManipulador()
EditorElementoGrafico
marco()crearManipulador()
ElemTexto
marco()crearManipulador()
TextView
getExtension()
+texto
return text.getExtension
return new ManipuladorTexto
Adaptador (Adaptador (AdapterAdapter//WrapperWrapper))
ClienteObjetivo
Adaptador
Adaptado
23
TreeDisplay
getChildren(Node)CreateGraphicNode(Node)display()BuildTree(Node n)
DirectoryTreeDisplay
getChildren(Node)createGraphicNode(Node)
getChildren(n);for each child {
addGraphicNode(CreateGraphicNode(child));buildTree(child)
}
FileSystemEntity
adaptadoradaptado
Objetivo, ClienteAbstracta
Adaptador (Adaptador (AdapterAdapter//WrapperWrapper))
Patrones Patrones GoFGoF
�� ObserverObserver
�� Define una dependencia de uno a Define una dependencia de uno a
muchos entre objetos asmuchos entre objetos asíí que que
cuando un objeto cambia de cuando un objeto cambia de
estado, todos los objetos que estado, todos los objetos que
dependen de dependen de éél son notificados l son notificados
para que se actualicen para que se actualicen
automautomááticamente.ticamente.
24
Patrones Patrones GoFGoF
�� ObserverObserver
� Define una dependencia de uno a muchos
objetos de tal manera que cuando un objeto
cambia su estado, todas sus dependencias son
notificadas actualizándose de manera automática
� Se usa cuando una abstracción tiene dos
aspectos y uno depende del otro. Encapsular
estos dos aspectos en objetos separados permite
actualizarlos y reutilizarlos de manera
independiente.
� Cuando un cambio en un objeto requiere
cambios en otros objetos asociados sin importar
el tipo de esos cambios!
ObserverObserver
�� Sus principales componentes Sus principales componentes son:son:
�� Sujeto:Sujeto: Puede tener asociados uno Puede tener asociados uno o mo máás observadoress observadores
�� Observador:Observador: Es notificado cuando Es notificado cuando el sujeto cambia de estado. Cada el sujeto cambia de estado. Cada observador pregunta al sujeto observador pregunta al sujeto acerca de su estado con el fin de acerca de su estado con el fin de sincronizar su estado con el del sincronizar su estado con el del sujeto.sujeto.
25
ObserverObserver
101080z
203050y
103060x
cba x
0
20
40
60
80
a b c
x
Promedio
a = 60
b = 30
c = 10
Sujeto
Observadores: N Observadores que cambian su presentación dependiendo de los datos del “Sujeto”
x
a
b
c
Notificación de
cambio
Solicitudes,
modificaciones
�Ejemplo: Uso
de una interfaz
gráfica para
separar la
presentación de
la lógica de los
datos
Todos los Observadores son
notificados de cualquier cambio en el estado del
“Sujeto”
ObserverObserver
SujetoAsociar (Observador)Desasociar (Observador)Notificar()
Observador
Actualizar()
ObservadorConcreto
estadoObservador
Actualizar()
SujetoConcretoestadoSujetodarEstado()modificarEstado()
observadores
Para todo o en observadores: o.Actualizar()
sujeto
estadoObservador= sujeto.darEstado()darEstado() retorna
estadoSujeto
Conoce a todos sus
Observadores
Define una inteface actualizable para
objetos que podrían ser notificados de
cambios en el “Sujeto”
Mantiene un estado y nofitica a los Observadores de sus cambios
Implementa la Interface para
mantener la actualización acorde con el estado del “Sujeto”
26
ObserverObserver
� Ejemplo de Implementación utilizando un
Manejador del Cambio: (evita al sujeto tener las referencias
de sus observadores)