You are on page 1of 0

LIDIA

Laboratorio de Investigacin y
desarrollo en Inteligencia Artificial
Departamento de Computacin
Universidade da Corua, Espaa
Programacin Orientada a Objetos
Tema 6: Patrones de Diseo
Eduardo Mosqueira Rey
2
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Objetivos
Introducir a los alumnos en los patrones de
diseo de software.
Explicar los distintos tipos de patrones y
mostrar ejemplos de aquellos patrones ms
sencillos y representativos de cada tipo.
Aprender a reconocer los patrones estudiados
y aprender a aplicarlos a problemas concretos
mediante su implementacin en un lenguaje
orientado a objetos como Java.
3
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
ndice
1. Introduccin
2. Patrones Creacionales
3. Patrones Estructurales
4. Patrones de Comportamiento
4
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
ndice
1. Introduccin
Historia
Tipos de patrones
5
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Introduccin
Historia
Objetivo
Crear una coleccin de literatura que ayude a resolver
problemas recurrentes encontrados durante el desarrollo del
software.
Las soluciones a los problemas deben ser efectivas y
reusables.
Efectivas en el sentido de que ya han resuelto el problema con
anterioridad satisfactoriamente,
Reusable en el sentido de que pueden aplicarse a un abanico de
problemas de diseo en distintas circunstancias.
Los patrones ayudan a la creacin de un lenguaje comn que
permita comunicar la experiencia con estos problemas y sus
soluciones.
Definicin
Un patrn es una regla con tres partes que expresa la relacin
entre un determinado contexto, un problema y una solucin.
Christopher Alexander (arquitecto)
6
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Introduccin
Historia
1977 Christopher Alexander
El trmino patrn deriva de los trabajos del arquitecto
Christopher Alexander sobre planificacin urbanstica y
arquitectura de edificaciones.
En su libro A Pattern Language defiende el uso de patrones
en la arquitectura pero sus ideas son aplicables a otras
disciplinas, como el desarrollo del software.
Alexander describa en sus trabajos un lenguaje de patrones y
un mtodo para aplicar estos patrones para conseguir diseos
que garantizasen la calidad de vida de sus usuarios.
1987 Ward Cunningham y Kent Beck
Decidieron aplicar algunas de las ideas de Alexander para
desarrollar un pequeo lenguaje compuesto por cinco patrones
que sirviera de gua para los desarrolladores novatos de
Smalltalk.
El resultado fue la publicacin Using Pattern Languages for
Object-Oriented Programs en el congreso OOPSLA87.
7
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Introduccin
Historia
1991 Jim Coplien
Compil un catlogo de lo que l llam Idiomas para el lenguaje C++.
Este catlogo fue publicado en 1991 bajo el ttulo Advanced C++
Programming Styles and Idioms .
Conferencias PLoP (Pattern Languages of Program Design)
Se comienzan a desarrollar en 1994 y tratan de refinar y extender las
definiciones de patrones con la ayuda de expertos en el rea
1995 Design Patterns: Elements of Reusable Object-Oriented
Software
En congresos posteriores se dedicaron reuniones especiales para
debatir el tema de patrones y el asunto fue madurando hasta la
publicacin 1995 del libro de Erich Gamma, Richard Helm, Ralph
Johnson y John Vlissides, conocidos habitualmente como la banda de
los cuatro (Gang of Four) o simplemente GoF.
El xito de este libro fue el espaldarazo definitivo que aup al tema de
los patrones como uno de los ms candentes dentro de los desarrollos
orientados a objetos.
8
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Introduccin
Tipos de Patrones
Segn el nivel conceptual:
Patrones arquitectnicos:
Un patrn arquitectnico expresa una organizacin estructural
fundamental para sistemas de software. El patrn provee de un
conjunto de subsistemas predefinidos, especifica sus
responsabilidades e incluye reglas y guas para organizar las
relaciones entre ellos.
Patrones de diseo:
Un patrn de diseo provee un esquema para refinar los
subsistemas o componentes de un sistema software, o las
relaciones existentes entre ellos. Describe una estructura comn y
recurrente de comunicacin entre componentes que resuelve un
problema general de diseo dentro de un contexto particular.
Idiomas:
Un idioma es un patrn de bajo nivel especfico para un lenguaje de
programacin. Un idioma describe como implementar aspectos
particulares de componentes o de relaciones entre ellos utilizando
las caractersticas de un determinado lenguaje.
9
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Introduccin
Tipos de Patrones
Antipatrones
Si los patrones representan prcticas correctas existen tambin
los antipatrones, que representan lecciones aprendidas en el
desarrollo del software.
Tipos: malas prcticas y refactoring
Antipatrn malas prcticas
Describen una mala solucin a un determinado problema y que nos
lleva a una mala situacin.
Es til ya que nos permite identificar las malas soluciones a tiempo
y nos permite apartarnos de ese camino y seguir el camino
marcado por los patrones apropiados para resolver el problema.
Antipatrn refactoring
Describen cmo salir de una mala situacin y transitar hacia una
buena solucin.
Intentan ir un paso ms all recomendando un curso de accin
para la correccin y recuperacin de situaciones indeseables. Est
tcnica se conoce habitualmente como refactoring .
10
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Introduccin
Tipos de Patrones
Tipos de patrones de diseo:
Patrones creacionales:
Tratan sobre cmo crear instancias de objetos y sobre cmo
hacer los programas ms flexibles y generales abstrayendo
el proceso de creacin de instancias.
Patrones estructurales:
Describen cmo las clases y los objetos pueden ser
combinados para formar estructuras mayores.
Patrones de comportamiento:
Son patrones que tratan de forma ms especfica con
aspectos relacionados con la comunicacin entre objetos.
11
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
ndice
2. Patrones creacionales
Inmutable
Instancia nica (Singleton)
Mtodo Factora (Factory Method)
12
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Aspectos que analizaremos de cada patrn:
Descripcin:
En la que se detallar el nombre del patrn, el tipo de problema
intenta resolver y a que grupo de patrones pertenece
Elementos que lo componen:
Qu clases componen el patrn, cul es la relacin entre ellas y
cmo es su funcionamiento (se muestra el grfico UML)
Ejemplo:
Cdigo de ejemplo en el que se aplique el patrn de diseo
Ventajas e Inconvenientes:
Qu ventajas e inconvenientes surgen con la aplicacin del patrn.
Ejemplo del API de Java:
Ejemplo del API de Java en el que se utiliza el patrn descrito.
13
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Inmutable
Descripcin
El patrn singleton se ocupa de disear clases que slo
permitan la existencia de una instancia, el patron inmutable se
encarga de disear clases que permiten crear cualquier nmero
de instancias pero no permite la posterior modificacin de estas
instancias. De esta forma, se evita tener que sincronizar los
objetos que comparten referencias al objeto inmutable.
Este patrn no aparece incluido en el libro GoF, aunque s en
otros libro de patrones como el de Grand
Elementos que lo componen
El esquema de este patrn consiste en una clase que incorpora
atributos privados, mtodos de lectura y mtodos que simulan
alterar el estado del objeto pero que en realidad devuelven una
nueva instancia de dicho objeto.
14
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Inmutable
Elementos que lo componen
Ejemplo
class Punt o
{
private int x;
private int y;
public Punt o( int _x, int _y)
{
x=_x;
y=_y;
}
public int get X( )
{ return x; }
public int get Y( )
{ return y; }
public Punt o of f set ( int xof f , int yof f )
{ return new Punt o ( x+xof f , y+yof f ) ; }
}
Inmutable
- atributos: tipo
+getAtributos(): tipo
+Actualiza (): Inmutable
15
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Inmutable
Ventajas
La principal ventaja del patrn inmutable es que nos asegura
que, una vez que hemos obtenido una referencia a un objeto,
ste no cambiar debido a efectos laterales de las
modificaciones de otros elementos sobre dicho objeto.
Recordemos que en Java cuando una clase contiene a un
objeto como parte de su estado, en realidad lo que contiene es
una referencia a ese objeto. Un mismo objeto, por tanto, puede
estar formando parte del estado de diversas clases por lo que
un cambio en dicho objeto provocar el efecto lateral de
cambios en el estado de todas las clases que lo referencian.
Sin embargo, si cada vez que se hace un cambio a un objeto
ste en realidad realiza esos cambios sobre un clon, dejando al
objeto original intacto, se habrn evitado los indeseados
efectos laterales.
16
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
:Punto
x =5
y =3
A
B
:Punto
x =7
y =5
A
B
(a) (b)
Patrones Creacionales
Inmutable
Ventajas
:Punto
x =5
y =3
A
B
:Punto
x =5
y =3
A
B
(a) (b)
:Punto
x =7
y =5
17
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Inmutable
Inconvenientes
La modificacin de su estado penaliza el rendimiento de la aplicacin
ya que en realidad implica la creacin de un nuevo objeto
Esta penalizacin slo ser significativa cuando sean necesarias
muchas modificaciones de los objetos inmutables o cuando la
creacin de un nuevo objeto inmutable sea un proceso costoso.
La solucin a este problema consiste en la definicin de clases
mutables asociadas a clases inmutables y que puedan utilizarse para
realizar las operaciones que resultan costosas en las clases
inmutables.
La clase mutable es idntica a la inmutable salvo en tres aspectos:
Las operaciones de modificacin del estado no crean nuevas instancias
sino que, efectivamente, varan el estado de esa clase.
Se incluye un nuevo constructor que permita crear instancias de la clase
mutable a partir de instancias de la clase inmutable.
Se incluye un mtodo que permite crear una instancia de la clase inmutable
a partir de una instancia de la clase mutable.
Ahora la modificacin sucesiva del estado de la clase inmutable puede
hacerse utilizando slo la clase inmutable o utilizando la clase
mutable.
18
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Inmutable
Clase mutable asociada a una clase inmutable
class Punt oMut abl e
{
private int x;
private int y;

public Punt oMut abl e( int _x, int _y)
{ x=_x;
y=_y;
}

public Punt oMut abl e( Punt o p)
{ x=p. get X( ) ;
y=p. get Y( ) ;
}

public int get X( )
{ return x; }

public int get Y( )
{ return y; }

public Punt oMut abl e of f set ( int xof f , int yof f )
{ x+=xof f ;
y+=yof f ;
return this;
}

public Punt o Punt oI nmut abl e( )
{ return new Punt o( x, y) ; }
}

19
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Inmutable
Modificaciones en una clase inmutable
public class Pat r onI nmut abl e
{
public static void mai n ( St r i ng [ ] ar gs)
{
int i ;

// Modificacin realizada directamente sobre el objeto inmutable
Punt o P1 = new Punt o( 5, 7) ;
for ( i =1; i <1000; i ++)
P1=P1. of f set ( 1, 2) ;
Syst em. out . pr i nt l n( P1. get X( ) + " " + P1. get Y( ) ) ;

// Modificacin realizada utilizando la clase mutable asociada
Punt o P2 = new Punt o( 5, 7) ;
Punt oMut abl e Aux = new Punt oMut abl e( P2) ;
for ( i =1; i <1000; i ++)
Aux=Aux. of f set ( 1, 2) ;
P2=Aux. mut abl eAI nmut abl e( ) ;
Syst em. out . pr i nt l n( P2. get X( ) + " " + P2. get Y( ) ) ;
}
}
20
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Inmutable
Ejemplo en el API de Java
En las clases String y StringBuffer
Un String en Java es inmutable ya que no puede ser modificado.
Existen una serie de mtodos que aparentan modificar el String
(como toLowerCase o substring) pero en realidad lo que hacen
es devolver una nueva instancia de un objeto de tipo String.
La clase mutable asociada a String es StringBuffer. Esta clase
incluye un constructor que permite crear un StringBuffer a partir
de un String, incluye los mismos mtodos que String pero sin
implicar la creacin de nuevos objetos e incluye un mtodo
toString que permite crear un String a partir de un
StringBuffer.
En Java 5.0
Se incluye una nueva clase StringBuilder con un API
compatible con StringBuffer, pero sin garanta de
sincronizacin
Se recomienda utilizar StringBuilder en aplicaciones que
utilizan un solo hilo de ejecucin (lo ms comn) porque es ms
eficiente que StringBuffer
21
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Instancia nica (Singleton)
Descripcin
Se utiliza para asegurarnos que una clase tiene slo una
instancia y proporcionar un punto global de acceso a ella.
Ejemplo: en un sistema pueden existir muchas impresoras pero
slo puede existir una instancia del objeto que representa al
gestor de impresin.
Elementos que lo componen
Una clase que define como privado su constructor (para evitar
la creacin de nuevos objetos), incluye un atributo de clase
privado (que se utiliza para alojar la instancia nica), y un
mtodo de clase que permite el acceso a dicha instancia.
22
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Instancia nica (Singleton)
Elementos que lo componen
Ejemplo
Singleton
- instancia: Singleton
- Singleton() <<constructor >>
+getInstancia (): Singleton

class Si ngl et on // Inicializacin temprana
{
private static Si ngl et on
i nst anci a=new Si ngl et on( ) ;

private Si ngl et on ( ) {}

public static Si ngl et on get I nst anci a( )
{ return i nst anci a; }
}
(a) Inicializacin temprana o early
class Si ngl et on // Inicializacin tarda
{
private static Si ngl et on i nst anci a=null;

private Si ngl et on ( ) {}

public static Si ngl et on get I nst anci a( )
{
if ( i nst anci a == null )
i nst anci a = new Si ngl et on( ) ;
return i nst anci a;
}
}
(b) Inicializacin tarda o lazy
23
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Mtodo Factora (Factory Method)
Descripcin
Permite definir un interfaz para crear un objeto pero permitiendo
que las subclases sean las que decidan qu objeto hay que
crear.
Elementos que lo componen
Producto (Product):
Define el interfaz de los objetos creados por el mtodo factora.
ProductoConcreto (ConcreteProduct):
Implementa el interfaz de los productos.
Creador (Creator):
Declara el mtodo factora, que devuelve un objeto de tipo
Producto. El mtodo factora puede ser abstracto o puede dar una
implementacin por defecto que devuelva un ProductoConcreto
determinado. Tambin puede definir otras operaciones que utilicen
el mtodo factora.
CreadorConcreto:
Sobreescribe el mtodo factora para devolver una instancia de un
ProductoConcreto.
24
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Mtodo Factora (Factory Method)
Elementos que lo componen
ProductoConcreto
metodoFactoria ()
unaOperacion ()
Creador

CreadorConcreto

metodoFactoria ()
producto =metodoFactoria();
return new ProductoConcreto();
Producto
25
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Mtodo Factora (Factory Method)
Ejemplo 1 (factora en clase abstracta):
abstract class FondoI nver si on
{
public int sal do;
protected St r i ng nombr e;

public St r i ng toString( )
{ return nombr e; }
}

class FI AMM extends FondoI nver si on
{
public FIAMM( int s)
{
sal do = s;
nombr e="FI AMM";
}
}

class FI M extends FondoI nver si on
{
public FIM( int s)
{
sal do = s;
nombr e="FI M";
}
}

abstract class Fact or i aFondo
{
public abstract FondoI nver si on creaFondoInversion( int sal do) ;
}

class Fact or i aFI AMM extends Fact or i aFondo
{
public FondoI nver si on creaFondoInversion( int sal do)
{ return new FIAMM( sal do) ; }
}

class Fact or i aFI M extends Fact or i aFondo
{
public FondoI nver si on creaFondoInversion( int sal do)
{ return new FIM( sal do) ; }
}

class Pat r onMet odoFact or i a
{
public static void main ( St r i ng [ ] ar gs)
{
Fact or i aFondo f act or i a = new FactoriaFIM( ) ;
FondoI nver si on f ondo = f act or i a. creaFondoInversion( 1000) ;
Syst em. out . println( "Mi f ondo es = " + f ondo) ;
}
}

El mtodo factora se
declara abstracto en
la superclase y DEBE
ser redefinido por las
subclases (no hay
implementacin por
defecto)
26
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Mtodo Factora (Factory Method)
Ejemplo 2 (factora en clase concreta):

abstract class FondoI nver si on
{
public int sal do;
protected St r i ng nombr e;

public St r i ng toString( )
{ return nombr e; }
}

class FI AMM extends FondoI nver si on
{
public FIAMM( int s)
{
sal do = s;
nombr e="FI AMM";
}
}

class FI M extends FondoI nver si on
{
public FIM( int s)
{
sal do = s;
nombr e="FI M";
}
}

class Fact or i aFondo
{
public FondoI nver si on creaFondoInversion( int sal do)
{ return new FIAMM( sal do) ; }
}

class Fact or i aFI AMM extends Fact or i aFondo
{
public FondoI nver si on creaFondoInversion( int sal do)
{ return new FIAMM( sal do) ; }
}

class Fact or i aFI M extends Fact or i aFondo
{
public FondoI nver si on creaFondoInversion( int sal do)
{ return new FIM( sal do) ; }
}

class Pat r onMet odoFact or i a2
{
public static void main ( St r i ng [ ] ar gs)
{
Fact or i aFondo f act or i a = new FactoriaFondo( ) ;
FondoI nver si on f ondo = f act or i a. creaFondoInversion( 1000) ;
Syst em. out . println( "Mi f ondo es = " + f ondo) ;
}
}

El mtodo factora no
es abstracto (incluye
una implementacin
por defecto) y
habitualmente la
superclase tampoco
es abstracta
No es necesario
utilizar las subclases
si no se quiere. Pero
se abre la posibilidad
a definir una subclase
especializada
27
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Mtodo Factora (Factory Method)
Ejemplo 3 (factora en clase concreta parametrizada):

abstract class FondoI nver si on
{
public int sal do;
protected St r i ng nombr e;

public St r i ng toString( )
{ return nombr e; }
}

class FI AMM extends FondoI nver si on
{
public FIAMM( int s)
{
sal do = s;
nombr e="FI AMM";
}
}

class FI M extends FondoI nver si on
{
public FIM( int s)
{
sal do = s;
nombr e="FI M";
}
}

class Fact or i aFondo
{ public FondoI nver si on creaFondoInversion( int t i po, int sal do)
{ switch ( t i po)
{
case 1 : return new FIAMM( sal do) ;
case 2 : return new FIM( sal do) ;
default: return new FIAMM( sal do) ;
}
}
}

class Fact or i aExt endi da extends Fact or i aFondo
{ public FondoI nver si on creaFondoInversion( int t i po, int sal do)
{ switch ( t i po)
{
case 1 : return new FIAMM( sal do) ;
case 2 : return new FIM( sal do) ;
default: return new FIM( sal do) ;
}
}
}

class Pat r onMet odoFact or i a3
{
public static void main ( St r i ng [ ] ar gs)
{
Fact or i aFondo f act or i a = new FactoriaFondo( ) ;
FondoI nver si on f ondo = f act or i a. creaFondoInversion( 1, 1000) ;
Syst em. out . println( "Mi f ondo es = " + f ondo) ;
}
}

En principio no hay
subclases para cada
producto sino una
construccin switch en
un mtodo plantilla
parametrizado
Se pueden definir
subclases que cambien
el funcionamiento del
mtodo plantilla
parametrizado
28
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Mtodo Factora (Factory Method)
Ejemplo 4 (factora en clase concreta parametrizada
usando reflexin):
class Fact or i aFondo
{
public FondoI nver si on creaFondoInversion( St r i ng t i po)
{
FondoI nver si on f = null;
try
{
f = ( FondoI nver si on) Cl ass. forName( " pat r ones. met odof act or i a. " +t i po) . newInstance( ) ;
}
catch ( Except i on e)
{
throw new IllegalArgumentException( ) ;
}
return f ;
}
}
class Pat r onMet odoFact or i a4
{
public static void main ( St r i ng [ ] ar gs)
{
Fact or i aFondo f act or i a = new FactoriaFondo( ) ;
FondoI nver si on f ondo = f act or i a. creaFondoInversion( " FI AMM" ) ;
Syst em. out . println( " Mi f ondo es = " + f ondo) ;
}
}
Usando reflexin podemos evitar el uso
del switch. Las clases se construyen a
partir de su nombre con el mtodo
Class.forName
Una vez obtenido el objeto Class que
representa a la clase podemos crear una
instancia usando el mtodo newInstance
NOTA: newInstance llama al constructor sin
parmetros, por eso se ha omitido el saldo a
la hora de construir el fondo. Para llamar al
constructor con parmetros podra usarse
Constructor.newInstance
Por simplicidad se recogen todas las
posibles excepciones y se manda una nica
IllegalArgumentException
29
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Creacionales
Mtodo Factora (Factory Method)
Ventajas
Elimina la necesidad de incluir referencias a clases concretas en un cdigo de
carcter ms genrico.
Lo que se hace es diferir a las subclases la decisin de qu objeto concreto
crear.
Adems este esquema es muy flexible ya que permite que las subclases creen
versiones extendidas de los objetos para tratar problemas particulares.
Inconvenientes
Puede obligar a extender la clase creadora slo para crear un producto
concreto.
Si no se quiere que esto ocurra es necesario buscar otras soluciones como el
patrn prototipo.
Ejemplo en el API de Java
La clase URLConnection tiene un mtodo denominado getContent que devuelve
el contenido de una URL empaquetado en el tipo de objeto apropiado.
El mtodo getContent delega su funcionamiento a un objeto del tipo
ContentHandler, que es una clase abstracta que juega el rol de producto en el
patrn.
Existe una clase ContentHandlerFactory que juega el rol de creador en el
patrn. La clase URLConnection tiene un mtodo denominado
setContentHandlerFactory que se utiliza para proveer de una factora que pueda
ser usada por los objetos URLConnection.
30
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
ndice
3. Patrones estructurales
Composicin (Composite)
Adaptador (Adapter)
31
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Composicin (Composite)
Descripcin
Es un patrn estructural que se utiliza para componer objetos
en estructuras de rbol que representan jerarquas todo-parte
Este patrn permite tratar uniformemente a los objetos y a las
composiciones y es un buen ejemplo de utilizacin conjunta de
herencia y composicin.
Elementos que lo componen
Componente abstracto: Declara la interfaz para los objetos en la
composicin implementando su comportamiento por defecto.
Adems declara la interfaz para acceder y manipular los
componentes hijos.
Componente concreto: Define el comportamiento de los objetos
elementales de la composicin (aquellos que no pueden tener
hijos).
Composicin (Composite): Define el comportamiento de los
objetos compuestos de la composicin.
Cliente: Maneja a los objetos a travs del interfaz Componente.
32
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Composicin (Composite)
Elementos que lo componen
Cliente
Hijos >
operacion ()
Componente
operacion ()
aadir (Componente)
eliminar (Componente)
getHijo (int)
Composicin
operacion ()
ComponenteConcreto
Redirige la
operacin
a sus hijos
33
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Composicin (Composite)
Ejemplo
class Cl i ent eAr bol
{
static public void mai n ( St r i ng[ ] ar g)
{
Nodo r ai z = new Nodo( ) ;

Hoj a h1 = new Hoj a( 5) ;
Nodo a1 = new Nodo( ) ;
Nodo a2 = new Nodo( ) ;
Hoj a h21 = new Hoj a( 5) ;
Hoj a h22 = new Hoj a( 3) ;
Hoj a h31 = new Hoj a( 6) ;
Hoj a h32 = new Hoj a( 4) ;
a2. aadi r ( h31) ;
a2. aadi r ( h32) ;
a1. aadi r ( a2) ;
a1. aadi r ( h21) ;
a1. aadi r ( h22) ;
r ai z. aadi r ( h1) ;
r ai z. aadi r ( a1) ;

Syst em. out . pr i nt l n( r ai z. oper aci on( ) ) ;
}
}

abstract class Ar bol
{ public abstract int oper aci on( ) ; }

class Hoj a extends Ar bol
{
private i nt val or ;

Hoj a ( int v)
{ val or = v; }

public int oper aci on( )
{ return val or ; }
}

class Nodo extends Ar bol
{
private j ava. ut i l . Vect or hi j os;

Nodo ( )
{ hi j os = new j ava. ut i l . Vect or ( ) ; }

public int oper aci on( )
{
int suma=0;
for ( int i =0; i < hi j os. si ze( ) ; i ++)
suma += get Hi j o( i ) . oper aci on( ) ;
return suma;
}

public void aadi r ( Ar bol a)
{ hi j os. addEl ement ( a) ; }

public void el i mi nar ( Ar bol a)
{ hi j os. r emoveEl ement ( a) ; }

public Ar bol get Hi j o ( i nt i )
{ return ( Ar bol ) hi j os. el ement At ( i ) ; }
}
34
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Composicin (Composite)
Elementos que lo componen (versin compleja)
Cliente
Hijos >
operacion ()
Componente
operacion ()
aadir (Componente)
eliminar (Componente)
getHijo (int)
ComposicionAbstracta
operacion ()
ComponenteConcreto1
operacion ()
ComponenteConcretoN
...
operacion ()
aadir (Componente)
eliminar (Componente)
getHijo (int)
ComposicionConcretaN
operacion ()
aadir (Componente)
eliminar (Componente)
getHijo (int)
ComposicionConcreta1
...
35
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Composicin (Composite)
Ventajas
El patrn composicin permite tratar a los objetos bsicos y a los
objetos compuestos de manera uniforme, facilitando la introduccin de
nuevos componentes sin afectar al cliente
Inconvenientes
Para restringir qu componentes concretos pueden ir en una
determinada composicin es necesario aadir comprobaciones en
tiempo de ejecucin
Seguridad y transparencia
La decisin de dnde situar las operaciones propias de la
Composicin (aadir, eliminar, getHijo) es una decisin entre
transparencia y seguridad
Transparencia: Si se definen en Componente se maximiza su interfaz
haciendo que las hojas y las composiciones puedan ser tratadas de
forma genrica (aunque puede dar lugar a comportamientos no
deseados cuando se intenta aadir o borrar hijos de una hoja)
Seguridad: Si se definen en Composicin estamos seguros de que las
operaciones se llaman sobre la clase correcta, pero ser necesario
trabajar con variables del tipo Composicin para utilizar estos mtodos
36
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Composicin (Composite)
Ejemplo en el API de Java
Container
(f rom awt)
Component
(from awt)
parent
component[]
Window
(from awt)
Frame
(from awt)
Panel
(f rom awt )
Button
(from awt)
Label
(f rom awt )
TextComponent
(from awt)
TextArea
(from awt)
TextField
(from awt)
Dialog
(from awt )
Scrol lPane
(f rom awt)
FileDialog
(from awt)
Choice
(from awt)
Canvas
(f rom awt )
Checkbox
(from awt)
List
(from awt)
Scrol lbar
(from awt)
Applet
(from appl et)
37
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Descripcin
Los interfaces se utilizan para desacoplar las clases clientes de
las clases que ofrecan ciertos servicios.
De esta forma se hace independiente la clase cliente de la clase
servidora, sin embargo se fuerza a que la clase servidora
implementara un determinado interfaz.
En diversas ocasiones puede no interesar modificar la clase
servidora, bien porque no se puede (porque no se dispone del
cdigo fuente), o porque no se quiere modificar la clase para un
determinado uso concreto y especializado.
Para convertir el interfaz de una clase en otro interfaz que es el
esperado por el cliente que usa dicha clase se utiliza el patrn
adaptador
38
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Elementos que lo componen
Objetivo (Target): Interfaz que utiliza el cliente.
Cliente (Client): Colabora con los objetos usando la interfaz Objetivo
Adaptado (Adaptee): Define una interfaz existente que necesita ser
adaptada.
Adaptador (Adapter): Adapta la interfaz del adaptado a la interfaz
Objetivo.
Esquema herencia mltiple
El objeto adaptador hereda el interfaz de Objetivo al mismo tiempo que
hereda de la clase Adaptado el mtodo PeticinEspecfica
En este caso la clase Objetivo slo puede desarrollarse mediante un
interface ya que Java no admite herencia mltiple en clases
convencionales.
Esquema composicin
El objeto adaptador hereda el interfaz de Objetivo y est compuesto de
un objeto del tipo Adaptado a cuyo mtodo PeticinEspecfica delega
las peticiones que le llegan del cliente
Objetivo puede ser un interface o una clase abstracta..
39
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Elementos que lo componen (herencia mltiple)

<<interface >>
Objetivo

Peticion ()
Adaptador

Peticion ()
Adaptado

PeticionEspecifica ()
Llama al mtodo
PeticionEspecifica()
Cliente
40
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Elementos que lo componen (composicin)
<<interface >>
Objetivo
Peticion ()
Adaptador
Peticion ()
Adaptado
PeticionEspecifica ()
Llama al mtodo
PeticionEspecifica()
del objeto adaptado
Cliente
41
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Ejemplo (herencia mltiple)
class Pat r onAdapt ador
{
public static void mai n ( St r i ng[ ] ar g)
{
Obj et i vo Adr = new Adapt ador ( ) ;
Adr . Pet i ci on( ) ;
}
}

interface Obj et i vo
{
public void Pet i ci on( ) ;
}

class Adapt ador extends Adapt ado implements Obj et i vo
{
public void Pet i ci on( )
{ Pet i ci onEspeci f i ca( ) ; }
}

class Adapt ado
{
public void Pet i ci onEspeci f i ca( )
{ Syst em. out . pr i nt l n ( "Pet i ci on especi f i ca. . . ") ; }
}

42
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Ejemplo (composicin)
class Pat r onAdapt ador
{
public static void mai n ( St r i ng[ ] ar g)
{
Adapt ado Ado = new Adapt ado( ) ;
Obj et i vo Adr = new Adapt ador ( Ado) ;
Adr . Pet i ci on( ) ;
}
}

interface Obj et i vo
{
public void Pet i ci on( ) ;
}

class Adapt ador implements Obj et i vo
{
private Adapt ado adapt ado;

public Adapt ador ( Adapt ado a)
{ adapt ado = a; }

public void Pet i ci on( )
{ adapt ado. Pet i ci onEspeci f i ca( ) ; }
}

class Adapt ado
{
public void Pet i ci onEspeci f i ca( )
{ Syst em. out . pr i nt l n ( "Pet i ci on especi f i ca. . . " ) ; }
}

43
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Ventajas e inconvenientes
Herencia mltiple
Slo permite adaptar una clase, no sus subclases
Permite que el adaptador sobreescriba parte de la conducta
del adaptado (ya que es una subclase)
Adems con la herencia nos evitamos la indireccin que se
produce en la composicin.
Composicin
Permite que un nico adaptador trabaje sobre muchos
adaptados (una clase y sus subclases).
Introduce un nivel ms de indireccin, lo cual implica una
penalizacin en rendimiento
Complica la sobreescritura de la conducta del adaptado (se
necesita crear una subclase del adaptado y que el adaptador
se refiera a esta subclase).
44
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Ejemplo en el API de Java (Eventos)

public void i ni t ( )
{ set Ti t l e ( " Pat r n adapt ador " ) ;
cont ent Pane. add( b1, Bor der Layout . WEST) ;
cont ent Pane. add( b2, Bor der Layout . EAST) ;
cont ent Pane. add( t , Bor der Layout . NORTH) ;
b1. addAct i onLi st ener ( new B1( ) ) ;
b2. addAct i onLi st ener ( new B2( ) ) ;
addWi ndowLi st ener ( new Wi ndowAdapt er ( )
{
public void wi ndowCl osi ng ( Wi ndowEvent e)
{ Syst em. exi t ( 0) ; }
}) ;
}

class B1 implements Act i onLi st ener
{ public void act i onPer f or med ( Act i onEvent e)
{ t . set Text ( Ado. Pet i ci onEspeci f i ca( ) + " Composi ci on" ) ; }
}

class B2 extends Adapt adoSwi ng implements Act i onLi st ener
{ public void act i onPer f or med ( Act i onEvent e)
{ t . set Text ( Pet i ci onEspeci f i ca( ) + " Her enci a ml t i pl e" ) ; }
}
}

class Adapt adoSwi ng
{
public String Pet i ci onEspeci f i ca( )
{ return " Pet i ci on especi f i ca. . . " ; }
}
import j avax. swi ng. *;
import j ava. awt . *;
import j ava. awt . event . *;

public class Pat r onAdapt ador Swi ng
{ public static void mai n ( St r i ng [ ] ar gs)
{ Vent ana f = new Vent ana( ) ;
f . show( ) ;
}
}

class Vent ana extends J Fr ame
{ private J But t on b1 = new J But t on ( " Bot on 1" ) ,
b2 = new J But t on ( " Bot on 2" ) ;
private J Text Fi el d t = new J Text Fi el d( 20) ;
private Adapt adoSwi ng Ado = new Adapt adoSwi ng( ) ;
Cont ai ner cont ent Pane = get Cont ent Pane( ) ;

public Vent ana( )
{ i ni t ( ) ;
pack( ) ;
}

. . .
Clase
Adaptado
Mtodo Peticion que
llama a
PeticinEspecifica
Clase
Adaptador
Interface
Objetivo
AddActionListener
requiere un objeto
que implemente el
interface Objetivo
(ActionListener)
45
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Estructurales
Adaptador (Adapter)
Ejemplo en el API de Java (Wrapper classes)
public final class I nt eger extends Number
{
public static final int MI N_VALUE = 0x80000000;
public static final int MAX_VALUE = 0x7f f f f f f f ;
private int val ue;

public I nt eger ( int val ue)
{ t hi s. val ue = val ue; }

public int i nt Val ue( )
{ return val ue; }

public boolean equals( Obj ect obj )
{
if ( ( obj ! = null) && ( obj instanceof I nt eger ) )
{ return val ue == ( ( I nt eger ) obj ) . i nt Val ue( ) ; }
return f al se;
}

public St r i ng t oSt r i ng( )
{ return St r i ng. val ueOf ( val ue) ; }
}

class Vect or I nt eger
{ public static void mai n ( St r i ng [ ] ar gs)
{ I nt eger suma;
int i 1, i 2;

j ava. ut i l . Vect or Vect or Ent er os = new j ava. ut i l . Vect or ( ) ;
Vect or Ent er os. add( new I nt eger ( 1) ) ;
Vect or Ent er os. add( new I nt eger ( 2) ) ;
i 1=( ( I nt eger ) Vect or Ent er os. el ement At ( 0) ) . i nt Val ue( ) ;
i 2=( ( I nt eger ) Vect or Ent er os. el ement At ( 1) ) . i nt Val ue( ) ;
suma=new I nt eger ( i 1+i 2) ;
Vect or Ent er os. add( suma) ;
for ( int i =0; i <3; i ++)
Syst em. out . pr i nt l n( ( ( I nt eger ) Vect or Ent er os. el ement At ( i ) ) . i nt Val ue( ) ) ;
}
}

Adaptado
Un vector
almacena objetos
que cumplan el
interfaz de Object
(nuestro interfaz
Objetivo)
Clase
Adaptador
Mtodo Peticion que llama
a PeticinEspecifica (se
llama a intValue para
obtener el valor de un int)
46
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
ndice
4. Patrones estructurales
Estado (State)
Observador (Observer)
Estrategia (Strategy)
Metodo plantilla (Template Method)
Comando (Command)
47
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estado (State)
Descripcin
El patrn estado es un patrn de comportamiento que permite a
un objeto modificar su conducta al cambiar su estado interno.
Elementos que lo componen
Contexto:
Mantiene una instancia de un estado concreto y puede incluir los
criterios para la transicin entre estados, aunque generalmente es
ms flexible que sean los propios estados los que definan sus
transiciones.
Estado:
Clase abstracta que encapsula el comportamiento de los estados
del contexto.
Estados concretos:
Cada subclase implementa el comportamiento asociado con un
estado del contexto
48
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estado (State)
Elementos que lo componen
Contexto
estado: Estado
operacion ()
Estado
operacion ()
EstadoConcretoA
operacion ()
EstadoConcretoA
operacion ()
...
Delega su
comportamiento a los
estados concretos:
estado.operacin()
49
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estado (State)
Ejemplo
A
op1
B C
op2
op1
op2
op1
op2
class Cont ext o
{
private Est ado est ado;
public Cont ext o ( )
{ est ado = Est adoA. get I nst anci a( ) ; }

public void op1( )
{ est ado. op1( t hi s) ; }

public void op2( )
{ est ado. op2( t hi s) ; }

void cambi aEst ado ( Est ado e)
{ est ado = e; }
}

50
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estado (State)
Ejemplo

abstract class Est ado
{
abstract void op1( Cont ext o c) ;
abstract void op2( Cont ext o c) ;
}

class Est adoA extends Est ado
{
private static Est adoA i nst anci a;
private Est adoA( ) {}
public static Est adoA get I nst anci a( )
{ if ( i nst anci a == null)
i nst anci a = new Est adoA( ) ;
return i nst anci a;
}
void op1( Cont ext o c)
{ . . . }
void op2( Cont ext o c)
{ c. cambi aEst ado( Est adoB. get I nst anci a( ) ) ; }
}
class Est adoB extends Est ado
{
// Cdigo del Singleton
. . .
void op1( Cont ext o c)
{ c. cambi aEst ado( Est adoA. get I nst anci a( ) ) ; }
void op2( Cont ext o c)
{ c. cambi aEst ado( Est adoC. get I nst anci a( ) ) ; }
}

class Est adoC extends Est ado
{
// Cdigo del Singleton
. . .
void op1( Cont ext o c)
{ c. cambi aEst ado( Est adoB. get I nst anci a( ) ) ; }
void op2( Cont ext o c)
{ c. cambi aEst ado( Est adoA. get I nst anci a( ) ) ; }
}

51
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estado (State)
Aspectos a tener en cuenta
Los propios estados son los que definen la transicin entre
ellos. Podra haberse utilizado el contexto si, por ejemplo, los
estados son utilizados por varias mquinas con distintas
transiciones.
El estado suele implementarse como una variable privada del
contexto. Si queremos que los estados sean capaces de
modificar esta variable privada debe ser accesible a travs de
un mtodo de escritura. La visibilidad de este mtodo puede
limitarse a package para evitar que otras clases lo utilicen pero
en este caso es necesario que tanto los estados como el
contexto se siten en el mismo paquete.
Los estados son definidos a travs del patrn de instancia
nica (singleton), tambin se podra haber optado por crearlos y
destruirlos cada vez que se necesiten.
52
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estado (State)
Cuando el comportamiento de un objeto depende de su estado interno
tenemos dos posibilidades:
Incluir en los mtodos del objeto sentencias condicionales que permitan
realizar unas operaciones u otras dependiendo del estado interno
Utilizar el patrn estado creando una clase abstracta que representa al estado
genrico y que se extiende con clases que representan estados concretos
Ventajas e inconvenientes
Primera solucin
Es ms sencilla de implementar y ms compacta
Se recomienda para un numero de estado pequeo, estable (no van a aparecer nuevos
estados en el futuro) y que afecta a pocos mtodos del contexto
Segunda solucin (patrn estado)
Es ms complicado y menos compacto que la solucin anterior
Localiza y separa el comportamiento especfico de cada estado.
Permite aadir nuevos estados de forma sencilla, simplemente aadiendo nuevas
clases.
Hace ms explcitas las transiciones entre estados.
Los objetos que representan a los estados pueden compartirse, siempre y cuando no
incluyan informacin en variables de instancia.
53
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Descripcin
Permite definir una dependencia uno a muchos entre objetos de tal
forma que, cuando el objeto cambie de estado, todos sus objetos
dependientes sean notificados y actualizados automticamente.
En este patrn es importante la suposicin de que el nmero de
objetos observadores no est limitado y que el objeto independiente
no tenga que hacer ninguna asuncin acerca de la clase a la que
pertenecen estos objetos.
Elementos que lo componen
Sujeto (Subject): Clase abstracta que conoce a sus observadores y que
proporciona la interfaz para agregar y eliminar observadores.
Observador (Observer): Clase abstracta que define un mtodo
actualizar utilizado por el sujeto para notificar cambios en su estado.
Sujeto concreto (ConcreteSubject): Subclase de sujeto que mantiene el
estado del mismo y que se encarga de notificar a los observadores al
cambiar su estado.
Observador concreto (ConcreteObserver): Subclase de observador que
mantiene una referencia al sujeto concreto e implementa la interfaz de
actualizacin.
54
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Elementos que lo componen

Sujeto Notifica >

Insertar (Observador)
eliminar (Observador)
notificar ()
SujetoConcreto
- estadoSujeto
+getEstado ()
+setEstado ()
Observador

actualizar ()
ObservadorConcreto
estadoObservador
actualizar ()
<obtiene estado
* 1
1 1
Llama al mtodo
actualizar de todos
sus observadores
estadoObservador =
sujeto.getEstado();
55
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Elementos que lo componen (clases y mtodos en Java)
Interfaz java.util.Observer
Mtodo Significado
void update (Observable o, Object arg) Mtodo llamado cuando cambia el estado del objeto observado

Clase abstracta java.util.Observable
Mtodo Significado
void addObserver (Observer o)
Aade un observador al conjunto de observadores para este objeto (siempre y
cuando el observado no haya sido aadido con anterioridad).
void deleteObserver (Observer o) Elimina un observador del conjunto de obsevadores para este objeto.
void deleteObservers() Elimina completamente la lista de observadores para este objeto.
int countObservers () Devuelve el nmero de observadores para este objeto.
void notifyObservers()
Si el objeto cambia, como es indicado por el mtodo hasChanged, entonces
notifica a todos sus observadores y llama al mtodo clearChanged para indicar
que el objeto ya ha notificado su cambio.
void notifyObservers(Object arg) Igual que el anterior pero pasando el argumento arg.
void setChanged()
Marca al objeto observable como que ha cambiado, de forma que ahora el
mtodo hasChanged devolver true.
void clearChanged ()
Indica que este objeto no ha cambiado ltimamente o que ya ha notificado a
todos sus observadores de un cambio reciente. De esta forma la llamada al
mtodo hasChange devolver false.
boolean hasChanged () Comprueba si el estado del objeto observado ha cambiado.

56
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Elementos que lo componen (cdigo en Java)
package j ava. ut i l ;

public class Obser vabl e
{
private boolean changed = false;
private Vect or obs;

public Obser vabl e( )
{ obs = new Vect or ( ) ; }

public synchronized void addObser ver ( Obser ver o)
{
if ( o == null)
throw new Nul l Poi nt er Except i on( ) ;
if ( ! obs. cont ai ns( o) )
{ obs. addEl ement ( o) ; }
}

public synchronized void del et eObser ver ( Obser ver o)
{ obs. r emoveEl ement ( o) ; }

public synchronized void del et eObser ver s( )
{ obs. r emoveAl l El ement s( ) ; }

public synchronized int count Obser ver s( )
{ return obs. si ze( ) ; }

public void not i f yObser ver s( )
{ not i f yObser ver s( null) ; }


public void not i f yObser ver s( Obj ect ar g)
{
Obj ect [ ] ar r Local ;

if ( ! changed) return;

ar r Local = obs. t oAr r ay( ) ;
cl ear Changed( ) ;
for ( int i = ar r Local . l engt h- 1; i >=0; i - - )
( ( Obser ver ) ar r Local [ i ] ) . updat e( this, ar g) ;
}


protected synchronized void set Changed( )
{ changed = true; }

protected synchronized void cl ear Changed( )
{ changed = false; }

public synchronized boolean hasChanged( )
{ return changed; }
}

package j ava. ut i l ;

public interface Obser ver
{ void updat e( Obser vabl e o, Obj ect ar g) ; }

57
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Ejemplo
import j ava. ut i l . *;

class pat r onObser vador
{
static public void mai n ( St r i ng[ ] ar gs)
{
Pi sci na l osCast r os = new Pi sci na ( 75) ;
Al ar maPi sci na al ar maSocor r i st a = new Al ar maPi sci na( ) ;
Al ar maPi sci na al ar maBomber os = new Al ar maPi sci na( ) ;

l osCast r os. addObser ver ( al ar maSocor r i st a) ;
l osCast r os. addObser ver ( al ar maBomber os) ;

Syst em. out . pr i nt l n ( "Ni vel de l a pi sci na: " + l osCast r os. get Ni vel ( ) ) ;
l osCast r os. abr eGr i f o( 10) ;
Syst em. out . pr i nt l n ( "Ni vel de l a pi sci na: " + l osCast r os. get Ni vel ( ) ) ;
l osCast r os. abr eGr i f o( 30) ;
Syst em. out . pr i nt l n ( "Ni vel de l a pi sci na: " + l osCast r os. get Ni vel ( ) ) ;
l osCast r os. qui t aTapon( 100) ;
}
}

58
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Ejemplo import j ava. ut i l . *;

class Pi sci na extends Obser vabl e
{
public static final int MAX=100;
public static final int MI N=50;
public static final St r i ng NI VEL_MAX="NI VEL_MAX" ;
public static final St r i ng NI VEL_MI N="NI VEL_MI N" ;
private int ni vel =75;

public Pi sci na ( int val or )
{ ni vel = val or ; }

public int get Ni vel ( )
{ return ni vel ; }

public void abr eGr i f o ( int i ncr ement o)
{ ni vel += i ncr ement o;
if ( ni vel > MAX)
{ set Changed( ) ;
not i f yObser ver s( NI VEL_MAX) ;
}
}

public void qui t aTapon ( int decr ement o)
{ ni vel - = decr ement o;
if ( ni vel < MI N)
{ set Changed( ) ;
not i f yObser ver s( NI VEL_MI N) ;
}
}
}

59
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Ejemplo
class Al ar maPi sci na implements Obser ver
{
public void updat e ( Obser vabl e o, Obj ect ar g)
{
Syst em. out . pr i nt l n ( "El ni vel de l a pi sci na es: "+( ( Pi sci na) o) . get Ni vel ( ) ) ;
if ( ar g. equal s ( Pi sci na. NI VEL_MAX) )
Syst em. out . pr i nt l n ( "Hay que VACI AR ur gent ement e l a pi sci na") ;
else
if ( ar g. equal s ( Pi sci na. NI VEL_MI N) )
Syst em. out . pr i nt l n ( "Hay que LLENAR ur gent ement e l a pi sci na") ;
}
}

60
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Implementacin del API de Java
Facilita la utilizacin del patrn pero obliga a que la clase observable herede de
la clase Observable
El interfaz Observer trabaja con elementos Observable genricos, es necesario
hacer un typecast para acceder a las caractersticas propias del objeto
observable
Ventajas
Al desacoplar los observadores de la clase observable, sta ltima no tiene por
qu conocer la clase concreta a la que pertenecen sus observadores,
simplemente se limita a notificar los cambios a travs de un interfaz conocido.
La responsabilidad del objeto observado se acaba con la notificacin, son los
observadores los que tienen que decidir qu accin llevar a cabo despus de la
notificacin.
Inconvenientes
Los observadores no tienen contacto entre si, esto puede dar lugar a
situaciones difciles de controlar cuando varios observadores responden
simultneamente ante un cambio. En el peor de los casos puede dar lugar a una
cascada de actualizaciones
La comunicacin entre observado y observadores es simple, lo que fuerza a los
observadores a deducir qu ha cambiado en el observado
Objetivo: buscar un equilibrio entre el pull model y el push model
61
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Pull model
Los observadores tiran del observado
El observado manda a los observadores una mnima notificacin
indicando que su estado ha cambiado
Es responsabilidad de los observadores descubrir qu ha cambiado y
actuar en consecuencia
Este modelo enfatiza la ignorancia que tiene el objeto observado de
sus observadores pero exige un mayor trabajo por parte de estos
ltimos (que puede dar lugar a problemas de eficiencia)
Push model
El observado empuja a los observadores
El observado manda a los observadores informacin detallada acerca
de lo que ha cambiado
En este modelo el observado tiene un cierto conocimiento sobre las
necesidades de los observadores. De esta forma no son tan
independientes como en el modelo pull
Sin embargo la comunicacin puede ser ms eficiente ya que no se
fuerza a descubrir a los observadores qu es lo que ha cambiado
62
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Observador (Observer)
Ejemplo en el API de Java
El patrn observador se utiliza en el modelo de eventos de Java
(el utilizado a partir del JDK 1.1).
Por ejemplo el esquema para crear una clase que observe a
un botn y que reaccione cuando este se pulsa sigue el
siguiente proceso:
Creamos una clase que implemente el interfaz ActionListener, lo
que nos obliga a dar implementacin a un mtodo actionPerformed
que acepta como parmetro a un objeto de la clase ActionEvent.
Registramos un objeto de la clase que implementa ActionListener
como escuchador del generador del evento (el botn). Este registro
se realiza mediante el mtodo addActionListener de la clase
JButton. Este mtodo acepta como parmetro una instancia de una
clase que implementa el interfaz ActionListener.
Cuando el evento de pulsar el botn sucede el botn avisa a todos
los escuchadores registrados de este hecho llamando a su mtodo
actionPerformed e incluyendo como parmetro un instancia de
ActionEvent.
63
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estrategia (Strategy)
Descripcin
El patrn estrategia es un patrn de comportamiento que se
utiliza para definir una familia de algoritmos, encapsularlos y
hacerlos intercambiables.
Elementos que lo componen
Estrategia (Strategy):
Declara una interfaz comn para todos los algoritmos soportados.
Estrategia concreta (ConcreteStrategy):
Implementa el algoritmo utilizando el interfaz definido por la clase
Estrategia.
Contexto (Context):
Mantiene una referencia a un objeto del tipo Estrategia instanciado
con una estrategia concreta
Delega en el objeto Estrategia el clculo del algoritmo
Puede definir una interfaz que permita a la clase Estrategia el
acceso a sus datos.
64
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estrategia (Strategy)
Elementos que lo componen
Contexto
InterfazContexto()
Estrategia
InterfazAlgoritmo ()
EstrategiaConcretaA
InterfazAlgoritmo ()
EstrategiaConcretaB
interfazAlgoritmo ()
...
65
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estrategia (Strategy)
Ejemplo
class Pat r onEst r at egi a
{
public static void mai n ( St r i ng[ ] ar g)
{
Cont ext o c = new Cont ext o( 5) ;
c. cal cul aX( ) ;
c. cambi aAl gor i t mo ( new Al gor i t moXPr eci so( ) ) ;
c. cal cul aX( ) ;
}
}
class Cont ext o
{
private Al gor i t moX al gor i t moX;
private int dat o;

public Cont ext o ( int d)
{ dat o = d;
al gor i t moX = new Al gor i t moXRapi do( ) ;
}

public void cal cul aX( )
{ al gor i t moX. Cal cul aVal or ( dat o) ; }

public void cambi aAl gor i t mo( Al gor i t moX al g)
{ al gor i t moX = al g; }
}

abstract class Al gor i t moX
{ abstract void Cal cul aVal or ( int dat o) ; }

class Al gor i t moXRapi do extends Al gor i t moX
{
void Cal cul aVal or ( int dat o)
{ Syst em. out . pr i nt l n ( "Cal cul amos X de f or ma r pi da") ; }
}

class Al gor i t moXPr eci so extends Al gor i t moX
{
void Cal cul aVal or ( int dat o)
{ Syst em. out . pr i nt l n ( "Cal cul amos X de f or ma pr eci sa") ; }
}
66
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Estrategia (Strategy)
Ventajas
Permite representar de forma sencilla familias de algoritmos
factorizando sus partes comunes en una misma clase padre.
Podra hacerse realizando subclases del contexto, pero mezclaramos
algoritmo y contexto complicando su comprensin o modificacin
De forma similar al patrn estado, la utilizacin del patrn estrategia
evita tener que utilizar mltiples sentencias condicionales en el
contexto para elegir el algoritmo adecuado.
Inconvenientes
Al compartir todos los posibles algoritmos un mismo interfaz, puede
pasar que las versiones ms sencillas del algoritmo no utilicen todos
los parmetros de inicializacin que le ofrece el contexto, lo que
significa una sobrecarga de comunicacin entre contexto y algoritmo.
Tambin puede ser un problema el nmero de objetos que hay que
crear si tenemos muchas alternativas aunque puede solucionarse
implementando las estrategias como objetos sin estado que puedan
compartirse entre distintos contextos.
Ejemplo en el API de Java
Gestores de composicin (Layout Managers)
67
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Mtodo Plantilla (Template Method)
Descripcin
Define el esqueleto de un algoritmo en una operacin pero difiriendo
alguno de los pasos a las subclases, de esta forma las subclases
pueden cambiar ciertos aspectos del algoritmo, sin cambiar su
estructura general.
El patrn mtodo plantilla debe su nombre a que utilizarlo es como
cubrir una plantilla o un formulario:
Una clase abstracta incluye un mtodo concreto que hace de plantilla
El mtodo plantilla llama a una serie de mtodos abstractos que son como
los huecos de la plantilla que deben cubrir las subclases.
Elementos que lo componen
Clase Abstracta (Abstract Class):
Define operaciones primitivas y abstractas que forman los pasos de un
algoritmo y que las subclases deben implementar. Tambin implementa el
mtodo plantilla que define el esqueleto del algoritmo. El mtodo plantilla
llama a las operaciones primitivas pero tambin puede utilizar otros
elementos de la clase abstracta o de otras clases.
Clase Concreta (Concrete Class):
Implementa las operaciones primitivas que definen el comportamiento
especfico del algoritmo para esta subclase.
68
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Mtodo Plantilla (Template Method)
Elementos que lo componen
ClaseAbstracta
MetodoPlantilla ()
OpPrimitiva1 ()
OpPrimitiva2 ()
...
OpPrimitiva1()
...
OpPrimitiva2()
...
ClaseConcreta
OpPrimitiva1 ()
OpPrimitiva2 ()
69
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Mtodo Plantilla (Template Method)
Ejemplo
class Pat r onPl ant i l l a
{
static void mai n( St r i ng[ ] ar gs)
{
Cl aseAbst r act a ccA = new Cl aseConcr et aA( ) ;
Cl aseAbst r act a ccB = new Cl aseConcr et aB( ) ;
ccA. al gor i t mo( ) ;
ccB. al gor i t mo( ) ;
}
}
abstract class Cl aseAbst r act a
{
final void al gor i t mo ( )
{
paso1( ) ;
paso2( ) ;
paso3( ) ;
}

protected abstract void paso1( ) ;
protected abstract void paso2( ) ;
protected void paso3( )
{ Syst em. out . pr i nt l n ( "Ver si on comn del paso 3") ; }
}

class Cl aseConcr et aA extends Cl aseAbst r act a
{
protected void paso1( )
{ Syst em. out . pr i nt l n ( "Ver si on A del paso 1") ; }
protected void paso2( )
{ Syst em. out . pr i nt l n ( "Ver si on A del paso 2") ; }
}

class Cl aseConcr et aB extends Cl aseAbst r act a
{
protected void paso1( )
{ Syst em. out . pr i nt l n ( "Ver si on B del paso 1") ; }
protected void paso2( )
{ Syst em. out . pr i nt l n ( "Ver si on B del paso 2") ; }
protected void paso3( )
{ Syst em. out . pr i nt l n ( "Ver si on B del paso 3") ; }
}
Operaciones primitivas que
DEBEN ser redefinidas en las
subclases (huecos de la
plantilla)
Hook methods. Mtodos
de enganche que
PUEDEN ser definidos en
las subclases
70
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Mtodo Plantilla (Template Method)
Ventajas e inconvenientes
La principal ventaja del patrn mtodo plantilla es que permite definir
la estructura general de un algoritmo pero permitiendo que las
subclases puedan cambiar ciertos aspectos, sin cambiar su estructura
general.
Esta manera de actuar, en la que la clase padre es la encargada de
llamar a las operaciones de las subclases y no al contrario, se conoce
como el principio de Hollywood , esto es, no nos llame, ya le
llamaremos .
Para que el desarrollo de este patrn sea efectivo es necesario indicar
de forma clara qu mtodos son de enganche y cules son
operaciones abstractas.
Ejemplo en el API de Java
La clase AbstractBorder del paquete java.swing.border implementa un
borde vaco y sin tamao que rodea a un componente grfico (de la
clase JComponent). Esta clase funciona como una clase base de la
cual pueden derivar otras clases que implementen bordes. Las
subclases deben dar una nueva implementacin especfica a los
mtodos definidos en AbstractBorder
71
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Mtodo Plantilla (Template Method)
Patrn estrategia y patrn mtodo plantilla
Similitudes
Se utilizan para implementar distintos tipos de algoritmos
similares
Diferencias
El patrn estrategia utiliza la delegacin (el contexto delega
en la estrategia) para escoger entre las distintas variantes de
un algoritmo (los algoritmos persiguen el mismo objetivo
pero pueden ser completamente diferentes)
El patrn mtodo plantilla utiliza la herencia para variar
determinadas partes de un algoritmo dado (no se puede
variar el esquema general del algoritmo)
72
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Comando (Command)
Descripcin
Permite encapsular una accin o requerimiento como un objeto de
forma que pueda pasarse como parmetro al cliente que la utilice
Permite crear acciones complejas a partir de acciones elementales y
realizar operaciones de undo
Elementos que lo componen
Comando (Command):
Declara un interfaz para ejecutar una operacin
ComandoConcreto (ConcreteCommand):
Implementa el interfaz Comando y define el enlace entre la accin y el
objeto que la recibe
Invocador (Invoker):
Solicita al comando que lleve a cabo la accin
Receptor (Receiver):
Recibe el encargo de realizar las operaciones asociadas con una accin
Cliente (Client):
Crea el comando concreto y fija su receptor
73
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Comando (Command)
Elementos que lo componen
Comando
+ ejecutar():
ComandoConcreto1
+ejecutar():
Receptor
+accion():
Invocador
ComandoConcreto2
+ejecutar():
Cliente
74
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Comando (Command)
Elementos que lo componen
: Cliente
: ComandoConcreto1
1: newComandoConcreto1(unReceptor)
: Invocador
2: setCommand(unComando)
Objecto1 : Invocador
1: ejecutaComando()
: ComandoConcreto1 : Receptor
2: ejecuta()
3: accion()
75
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Comando (Command)
Ejemplo
interface Comando
{
void ej ecut a( ) ;
}

class ComandoBor r ar Vocal es implements Comando
{
Recept or r ;
public ComandoBor r ar Vocal es( Recept or r )
{ this. r = r ; }

public void ej ecut a( )
{ Syst em. out . pr i nt l n( "Ej ecut amos l a acci on de bor r ar vocal es") ;
r . bor r ar Vocal es( ) ;
}
}

class ComandoBor r ar Consonant es implements Comando
{
Recept or r ;
public ComandoBor r ar Consonant es( Recept or r )
{ this. r = r ; }

public void ej ecut a( )
{ Syst em. out . pr i nt l n( "Ej ecut amos l a acci on de bor r ar consonant es" ) ;
r . bor r ar Consonant es( ) ;
}
}

class Recept or
{
St r i ngBuf f er s;

Recept or ( St r i ng s)
{ this. s = new St r i ngBuf f er ( s) ; }

public void bor r ar Vocal es( )
{ Syst em. out . pr i nt l n( "Vocal es bor r adas") ; }

public void bor r ar Consonant es( )
{ Syst em. out . pr i nt l n( "Consonant es bor r adas" ) ; }
}



class I nvocador
{
Comando c;

public I nvocador ( Comando c)
{ this. c = c; }

public void ej ecut aComando( )
{ c. ej ecut a( ) ; }

public void set Comando( Comando c)
{ this. c = c; }
}


class Pat r onComando
{
public static void mai n ( St r i ng[ ] ar gs)
{
Recept or r = new Recept or ( "Hol a Mundo 123") ;
ComandoBor r ar Vocal es c1 = new ComandoBor r ar Vocal es( r ) ;
ComandoBor r ar Consonant es c2 = new ComandoBor r ar Consonant es( r ) ;

I nvocador i 1 = new I nvocador ( c1) ;
I nvocador i 2 = new I nvocador ( c2) ;

try
{
if ( ar gs[ 0] . equal s( "vocal es") )
i 1. ej ecut aComando( ) ;
else if ( ar gs[ 0] . equal s( "consonant es") )
i 2. ej ecut aComando( ) ;
else Syst em. out . pr i nt l n( "Comando no def i ni do") ;
}
catch ( Except i on e)
{ Syst em. out . pr i nt l n( "No has i ndi cado ni ngun comando" ) ; }
}
}


76
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Comando (Command)
Ventajas
El patrn desacopla el objeto que invoca la accin del objeto que finalmente la
ejecuta
Al encapsular acciones en objetos estas pueden ser manipuladas,
intercambiadas y extendidas como otros objetos
Resulta sencillo aadir nuevos comandos ya que slo habra que crear su clase
correspondiente, sin afectar a la otras clases
Es sencillo realizar comandos que se compongan de otros comandos utilizando
patrones como el Composicin
Se pueden implementar acciones de deshacer (undo) si el comando, adems de
tener un mtodo ejecutar tiene un mtodo deshacer
Inconvenientes
Como todos los patrones aumenta el nmero de clases del sistema aumentando
su complejidad, adems el interfaz de todos los comandos tiene que ser igual.
Qu acciones realiza un comando?
Comando simple
Acta simplemente como un enlace entre las llamadas del invocador y las acciones del
receptor permitiendo desacoplar invocador y receptor
Comando inteligente
El comando es el encargado de realizar las acciones sin necesidad de delegar en un
receptor (que es posible que no exista)
77
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Comando (Command)
Soporte en Java
Java define un interfaz Action en el paquete javax.swing
Este interfaz hereda del interfaz ActionListener del paquete
java.awt.event por lo que si se implementa el interfaz hay que
implementar el mtodo actionPerformed
Adems el interfaz define una serie de constantes de clase que nos
permiten definir las caractersticas de la accin que encapsulan

Field Summary
st at i c St r i ng ACCELERATOR_KEY
Thekey used for storing a KeySt r oke to beused as theaccelerator for theaction.
st at i c St r i ng ACTION_COMMAND_KEY
The key used to determine the command St r i ng for theAct i onEvent that will becreated when an
Act i on is going to benotified as theresult of residing in a Keymap associated with a J Component .
st at i c St r i ng
DEFAULT
Not currently used.
st at i c St r i ng LONG_DESCRIPTION
The key used for storing a longer St r i ng description for theaction, could beused for context-sensitive
help.
st at i c St r i ng MNEMONIC_KEY
Thekey used for storing a KeyEvent to beused as the mnemonic for the action.
st at i c St r i ng NAME
Thekey used for storing theSt r i ng namefor theaction, used for a menu or button.
st at i c St r i ng SHORT_DESCRIPTION
Thekey used for storing a short St r i ng description for the action, used for tooltip text.
st at i c St r i ng SMALL_ICON
Thekey used for storing a small I con, such as I mageI con, for the action, used for toolbar buttons.

78
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Patrones Comportamiento
Comando (Command)
Soporte en Java (cont.)
Los componentes grficos de Swing permiten que se les asocien
acciones
A traves del constructor: JButton (Action a)
A travs de mtodos de escritura: public void setAction(Action a)
Funcionamiento
Creamos la clase que representa la accin:
Creamos una instancia
private Action openAction = new OpenAction();
La asociamos a componentes grficos de nuestra interfaz
jButton2.setAction(openAction);
jMenuItem5.setAction(openAction);

class OpenAct i on extends Abst r act Act i on
{ public OpenAct i on( )
{ put Val ue( Act i on. NAME, "Open") ;
put Val ue( Act i on. SMALL_I CON, new I mageI con( get Cl ass( ) . get Resour ce( "/ i cons/ Open. gi f ") ) ) ;
put Val ue( Act i on. SHORT_DESCRI PTI ON, "Open VAL f i l e") ;
}

public void act i onPer f or med( Act i onEvent e)
{ myDat a = obt ener Val i dat i onDat a( ) ;
set Ti t l e( "Appl i cat i on ( def aul t dat a) ") ;
}
}

79
Eduardo Mosqueira Rey Departamento de Computacin Universidade da Corua
Bibliografa
Bibliografa fundamental
Gamma, E., Helm, R., Johnson, R., Vlissides, J. Desing Patterns: Elements of Reusable
Object-Oriented Software, Addison-Wesley, Reading, MA, 1995.
Grand, M., Patterns in Java: A catalog of reusable design patterns illustrated with UML,
John Wiley and Sons, New York, 1998.
Cooper, J.W. Java Design Patterns: A Tutorial, Addison-Wesley, Reading, MA, 2000.
Brown, W.J., Malveau, R.C., McCormick, H.W., Mowbray, T.J., Antipatterns: Refactoring
Software, Architectures and Projects in Crisis, John Wiley and Sons, New York, 1998.
Bibliografa complementaria
Larman, C. Applying UML and Patterns , Prentice-Hall PTR, Upper Saddle River, NJ, 2005
Rising, Linda, The Pattern Almanac 2000, Addison-Wesley, Boston, 2000.
Coplien, J. Advanced C++ programming styles and idioms , 1991.
Cunningham, W., Beck, K., Using pattern languages for object-oriented programs ,
OOPSLA87, Orlando, 1987.
Bibliografa en internet
Patterns Home Page, URL: http://hillside.net/patterns/
Design Patterns, Pattern Languages, and Frameworks.
URL: http://www.cs.wustl.edu/~schmidt/patterns.html
Object-Oriented Language: Patterns.
URL: http://www.cetus-links.org/oo_patterns.html
Eckel, B. Thinking in Patterns with Java .
URL: http://www.mindview.net/Books/TIPatterns/

You might also like