Sie sind auf Seite 1von 58

RemigioTemplate,Mediator.

Teora:Bridge,Observer
CarlosAbstractfactory,factorymethod.Teoria:Chainofresponsibility.Prototype
RobertoDecorator,comandos,teora:InterpreteryVisitor
GustavoStrategy,FlyweightTeora:Statedescripcindetiposdepatrones,eintro
ClaudiaAdapter,Facade Teora:Builder,Composite
Objetivo
TC4010PatronesdeDiseo
Conocerycomprenderlospatronesdediseodefinidosporlapandilladeloscuatro(Gangof
Four)
Estaactividadtieneuncomponentegrupalyotroindividual.
Desarrollo
Esta parte es grupal. Realiza una investigacin bibliogrfica sobre los patrones de diseo
definidos por la Pandilla de los Cuatro. Como resultado se deber presentar un documento al
estilo monografa sobre los patrones. La monografa debe contener una breve introduccin a
lospatronesyladescripcindecadaunodeellos,incluyendocdigoqueilustresuuso.
Esta parte es individual. Como parte de la monografa descrita arriba cada alumno
implementar dos de los siguientes patrones, usando ejemplos propios, evitando usar loe
ejemplos que comnmente se encuentran en internet. Los patrones que se implementen
debernserdiferentesentres.
Los patrones de comportamiento describen no solamente estructuras de relacin entre
objetos o clases sino tambin esquemas de comunicacin entre ellos y se pueden clasificar
en funcin de que trabajen con clases (Mtodo Plantilla) u objetos (Cadena de
Responsabilidad,Comando,Iterador,Recuerdo,Observador,Estado,Estrategia,Visitante).
INDICE
1
INTRODUCCIN
PATRONESDECREACIN
Abstractfactory
Builder
FactoryMethod
Prototype
PATRONESESTRUCTURALES
Adapter
Bridge
Composite
Decorator
Facade
Flyweigth
PATRONESDECOMPORTAMIENTO
ChainofResponsibility
Command
Interpreter
Mediator
Observer
State
Strategy
TemplateMethod
Visitor
Bibliografa
Dubuis,E.Interpreter.SoftwareEngineering2:SlidesandotherCourseMaterial.
Dubuis,E.Visitor.SoftwareEngineering2:SlidesandotherCourseMaterial.
INTRODUCCIN
2
UnpatrndeDiseo,esunconjuntodedecisionesdediseoquesepuedenaplicar
repetidamenteenlaprctica.Esdecir,queresuelveunproblemaqueocurreunayotravez
enelentorno.Elpatrndescribelabasedelasolucinaestosproblemasycuentacon
propiedadesquepermitensureusoademsquedescribeauntipodearquitectura.En
general,unpatrndediseocuentaconcuatroelementosesenciales:
1. Nombre
Seusaparadescribirelproblemadediseo,solucinyconsecuenciasenunaodos
palabras.
2. Problema
Describecundoaplicarelpatrn.Explicaelproblemaysucontexto,tambin
condicionesquepudieranserrequeridasparaaplicardichopatrn.
3. Solucin
Describeloselementos,lasrelaciones,responsabilidadesqueconformaneldiseo.
Nodescribeundiseoconcreto,pueslospatronessonmsbienunaespeciede
plantilla.Unadescripcinabstractadelproblemaycomounarreglodeelementoslo
resuelve.
4. Consecuencias
Sonlosresultados,ventajasodesventajasdeaplicarelpatrn.Sonclavepara
entenderloscostosybeneficiosdeaplicarunouotropatrn.
Acontinuacin,sedescribeuncatlogodepatronesdeacuerdoalospropuestosporla
pandilladelos4ysegnsucategora.Lastrescategorassonpatronesdecreacin,
patronesestructuralesypatronesdecomportamiento.Estassedescribenmsadetalleen
cadaseccin.
PATRONES DE CREACIN
Los patrones de creacin abstraen el proceso de instanciacin. Ayudan a independizar un
sistema sobre cmo se crean, representan o se componen los objetos. Hay dos temas
principales en este tipo de patrones: (1) encapsulan el conocimiento sobre que clases
concretas se usan dentro del sistema, y (2) esconden el cmo las instancias de esas clases
soncreadasyutilizadas.
Abstract factory
3
Nombre:AbstractFactory(Fbricaabstracta)
Clasificacin:Creacin
Intencin:Proveeunainterfazparacrearfamiliardeobjetosrelacionadosodependientessin
especificarsusclasesconcretas.Elmtododefbricaabstractaesmuyparecidoalpatrn
mtodofbrica.Unadiferenciaentrelos2esqueconelpatrndefbricaabstracta,unaclase
delegalaresponsabilidaddeinstanciarobjetosaotroobjetopormediodecomposicin,
mientrasqueelpatrnmtodofbricautilizaherenciaydependedeunasubclasepara
manejarlainstanciacindelobjetodeseada.
Tambinconocidocomo:
Motivacin:Unejemplodelmtododefbricaabstractapuedeverseconloskitsde
herramientasparainterfazgrfica.ATravsdeWindows,OSXyLinux,UIcompuestosde
ventanas,botonesycamposdetexto,sonprovistosporunwidgetAPIcomoSWT.Sin
embargo,laimplementacindeestoswidgetsvaraentrelasdiferentesplataformas.Se
podraescribirunclienteindependientedelaplataformagraciasalaimplementacindel
mtododefbricaAbstracta.
Aplicabilidad:Estepatrnesmejorutilizadocuandoelsistematienequecrearmltiples
familiasdeproductososequiereproveerlibrerasdeproductossinexponerlosdetallesdela
implementacin.Estepatrnpuedeemplearseencualquieradelassiguientessituaciones:
Unsistemadebeserindependientedecmosusproductossoncreados,
compuestos,ypresentados.
Unaclasenopuedeanticiparlaclasedeobjetosquedebecrear.
Unafamiliadeproductosrelacionadosesdiseadaparaserusadajunta,ynecesita
forzarelusodeestalimitante.
Estructura:
4
Participantes:
AbstractFactory:definelainterfazquetodaslasfbricasconcretas
(ConcreteFactory1,ConcreteFactory2,etc...)necesitarnimplementarparaproducir
productos(ProductA1,ProductA2).
ConcreteFactory(ConcreteFactoryA,ConcreteFactoryB):Estas2claseshan
implementadolainterfazAbstractFactory,creando2familiasdeproductosseparadas.
AbstractProduct(AbstractProductA,AbstractProductB):Estos2soninterfaces
paradiferentestiposdeproductos.Cadafbricacreaunodeestosproductos
abstractos.
Client:TrataconAbstractFactory,AbstratProductAyAbstractProductB..Elclienteno
sabenadaacercadelasimplementaciones.LaimplementacindeAbstractFactory
queelclienteutilizaresdeterminadadurantelaejecucin.
5
Colaboracin:Normalmenteunasolainstanciadeunafbricaconcretaescreadaenla
ejecucin.Estafbricaconcretacreaproductosquetienenunaimplementacinparticular.
Paracreardiferentesproductos,elclienteoclientesdebenusarunafbricaconcreta
diferente.Elpatrndefbricaabstractadelegalacreacindeproductosasusfbricas
concretas.
Consecuencias:
Beneficios
Aslaalclientedelaimplementacinconcretadelasclases.
Hacequeelintercambiarfamiliasdeproductosseasencillo,graciasaqueuna
fbricaconcretapartculaspuedesoportaraunafamiliadeproductos
completa.
Aplicaelusodeproductosdeunasolafamilia.
Desventajas
Unodelosprincipalesinconvenienteseslacomplejidadadicionalalescribirel
cdigodurantelasetapasiniciales.
Implementacin:AbstractFactoryconfaensussubclasesparaimplementarelmtodo
fbrica,demodoqueretornaunainstanciadeunaproductoconcretoapropiado.
Ejemplo:
6
UsosConocidos:Ellenguajedeprogramacinjavaempleadentrodesuslibreraseste
patrn:
javax.xml.parsers.DocumentBuilderFactory#newInstance()
javax.xml.transform.TransformerFactory#newInstance()
javax.xml.xpath.XPathFactory#newInstance()
Patronesrelacionados:Factorymethod.
Builder
Nombre:Builder
Clasificacin:Creacin
Intencin: Abstrae el proceso de creacin de un objeto complejo, centralizando dicho
proceso en un nico punto, de tal forma que el mismo proceso de construccin pueda crear
representacionesdiferentes.
Tambinconocidocomo:Constructor
7
Motivacin: Los objetos que dependen de un algoritmo tendrn que cambiar cuando el
algoritmo cambia. Por lo tanto los algoritmos que estn expuestos a dicho cambio deberan
ser separados, permitiendo de esta manera reutilizar algoritmos para crear diferentes
representaciones.
Aplicabilidad:
ElpatrnBuilderseusacuando:
El algoritmo para creacin de un objeto complejo debe ser independiente de las partes
queconformanelobjetoycmoestnensambladas.
El proceso de construccin debe permitir diferentes representaciones del objeto que
seconstruye.
Estructura:
Participantes:
Builder: Especifica una interfaz abstracta para la creacin de partes de un objeto
Producto
ConcreteBuilder:
Construye y ensambla las partes del producto por implementacin de la
interfazBuilder.
Defineyguardalarutadelarepresentacinquecrea.
Proveeunainterfazpararecuperacindelproducto.
Director:ConstruyeunobjetousandolainterfazBuilder
Product:
Representa el objeto complejo en construccin. El ConcreteBuilder construye
la representacin interna del producto y define el proceso con el cual se
ensambla.
Incluye las clases que definen las partes componentes, incluyendo interfaces
paraensamblarlaspartesdentrodelresultadofinal.
Colaboracin:
8
ElClientecreaelobjetoDirectoryloconfiguraconelobjetoBuilderdeseado.
ElDirectornotificaalconstructorcundounapartedelproductosedebeconstruir.
ElBuildermanejalosrequerimientosdesdeeldirectoryagregapartesalproducto.
ElClienterecuperaelproductodesdeelconstructor.
Consecuencias:
1. Permitevariarlarepresentacininternadeunproducto.
2. Permitesepararelcdigodelaconstruccinylarepresentacin.
3. Dacontrolrefinadosobreelprocesodeconstruccin.
Implementacin:
Lospasosparalacorrectautilizacindelpatrnsonlossiguientes:
1. ElClientecreaunobjetoDirectoryloconfiguraconelobjetoBuilder.
2. El Director notifica al constructor cuando una parte del Producto se debe
construir.
3. ElBuildermanejalaspeticionesdelDirectoryagregalaspartesalProducto.
9
4. ElClienteelproductodelBuilder.
Ejemplo:
Unacocina:Director
Laspizzas:Product
Lasdiferentesvariedadesdepizzas:ConcreteBuilder
Producto:
class Pizza {
private String base;
private String salsa;
private String ingredientes;
/* Getters y Setters */
}
Builder:
abstract class PizzaBuilder {
protected Pizza pizza;
public Pizza getPizza() {
return this.pizza;
}

public void createPizzaProduct() {
this.pizza = new Pizza();
}

public abstract void hacerBase();
public abstract void hacerSalsa();
public abstract void hacerIngredientes();
}
ConcreteBuildersquesernlaspizzasespecficasdecadatipo:
class Carbonara extens PizzaBuilder {
public void hacerBase() {
this.pizza.setBase(FINA);
}

public void hacerSalsa() {
this.pizza.setSalsa(NATA);
}

public void hacerIngredientes() {
this.pizza.setIngredientes(BACON + CEBOLLA);
}
}

class Barbacoa extens PizzaBuilder {
10
public void hacerBase() {
this.pizza.setBase(GRUESA);
}

public void hacerSalsa() {
this.pizza.setSalsa(TOMATE);
}

public void hacerIngredientes() {
this.pizza.setIngredientes(CARNE + CARNE);
}
}

class Mediterranea extens PizzaBuilder {
public void hacerBase() {
this.pizza.setBase(EXTRA_FINA);
}

public void hacerSalsa() {
this.pizza.setSalsa(NO);
}

public void hacerIngredientes() {
this.pizza.setIngredientes(ACEITUNA + ALCACHOFA);
}
}
Director:
class Cook {
private PizzaBuilder pizzaBuilder;

public void setPizzaBuilder(PizzaBuilder pb) {
this.pizzaBuilder = pb;
}

public Pizza getPizza() {
return this.pizzaBuilder.getPizza();
}

public void hacerPizza() {
pizzaBuilder.createPizzaProduct();
pizzaBuilder.hacerBase();
pizzaBuilder.hacerSalsa();
pizzaBuilder.hacerIngredientes();
}
}
UsosConocidos:Usosparser
Patronesrelacionados:
AbstractFactory
11
Composite
Strategy
Factory Method
Nombre:TheFactorymethod.
Clasificacin:Creacin.
Intencin:Definirunainterfazparacrearunobjeto,perolassubclasesdecidenqueclase
concretainstanciar.Elfactorymethodlepermiteaunaclasedelegarlainstanciacinalas
subclases.
Tambinconocidocomo:
Motivacin: Un buen ejemplo de la utilizacin del patrn de fbrica es al crear una conexin
a una fuente de datos, si el tipo de la fuente de datos va a ser seleccionado por el usuario
final usando una interfaz grfica. En este caso, una clase abstracta denominada "origen de
datos" puede ser creada la cual define la funcionalidad base de todas las fuentes de datos.
Muchas subclases concretas pueden ser creadas, tal vez "SqlDataSource",
"XmlDataSource", "CsvDataSource", etc, cada una con una funcionalidad especfica, para un
tipo diferente de datos. En tiempo de ejecucin, alguna otra clase, quizas llamada
"DataSourceFactory", puede generar objetos de la clase concreta correcta en base a un
parmetroquesepasaalmtodofabrica.
Aplicabilidad:Laideadetrsdeestepatrn,enuncasodondeelclientenosabequeclases
concretasvaarequerircreardurantelaejecucin,perorequiereunaclasequehagael
trabajo.Sepuedenverfbricasutilizadasenframeworksdelogging,yenmuchosescenarios
dondeelclientenonecesitasaberacercadelasimplementacionesconcretas.Esunbuen
acercamientoparaencapsulacin.
Estructura:
12
Participantes:
Product:DefinelainterfazparaeltipodeobjetosqueelmtodofactoryMethod
crea.Todoslosproductosdebenimplementarlamismainterfazdemodo,quelas
clasesquehacenreferenciaalosproductospuedanhacerlopormediodelainterfazy
nolaclaseconcreta.
ConcreteProduct:ImplementalainterfazdeProduct.
Creator:Esunaclasequecontienelaimplementacindetodoslosmtodospara
manipularproductos,aexcepcindelfactoryMethod.ElfactoryMethodsloes
declarado,seimplementaencadaunadelassubclasescreadoras
(ConcreteCreator).
ConcreteCreator:ImplementaelfactoryMethodpararetornarunainstanciadel
ConcreteProduct.EsresponsableporcrearunoomsconcreteProducts.Eslaunica
clasequetieneelconocimientodecmocrearestosconcreteProducts.
Colaboracin:LaclaseCreatordependedesussubclasesparaimplementarel
factorymethod,deformaquesteretornaunainstanciadelConcreteProductapropiado.
CuandosedicequeelpatrnFactorymethodpermitequelassubclasesdecidanqueclase
sevaainstanciar,significaquelaclaseCreatoresescritasinsaberqueclase
ConcreteProductserinstanciada.LaclaseConcreteProductqueseinstancia,es
determinadanicamenteporlasubclaseConcreteCreatorqueseinstanciayesutilizadapor
laaplicacin.
Consecuencias:
Beneficios
Elcdigosevuelvemsflexibleyreutilizable,porlaeliminacindelacreacin
deinstanciasdeclasesespecficasdelaaplicacin.
ElcdigolidiasolamenteconlainterfazdelaclasesProductoypuedetrabajar
concualquierConcreteProductquesoportelainterfaz.
Desventajas
LosclientespuedentenerquehacerunasubclasedelaclaseCreator,solo
parainstanciarunConcreteProductenparticular.
Puedesermuycomplicado.
Implementacin:
Ejemplo:
UsosConocidos:
java.util.Calendar#getInstance()
java.util.ResourceBundle#getBundle()
java.text.NumberFormat#getInstance()
java.nio.charset.Charset#forName()
13
java.net.URLStreamHandlerFactory#createURLStreamHandler(String)(Returns
singletonobjectperprotocol)
Patronesrelacionados:Elabstractfactorymethodpuedeversecomounaversinms
complejadelfactorymethod.
Prototype
Nombre:Prototype
Clasificacin:Creacional
Intencin:ElpatrndediseoPrototype(Prototipo),tienecomofinalidadcrearnuevos
objetosduplicndolos,clonandounainstanciacreadapreviamente.
Estepatrnespecificalaclasedeobjetosacrearmediantelaclonacindeunprototipoque
esunainstanciayacreada.Laclasedelosobjetosqueservirndeprototipodeberincluiren
suinterfazlamaneradesolicitarunacopia,queserdesarrolladaluegoporlasclases
concretasdeprototipos.
Tambinconocidocomo:
Motivacin:Uneditorgrfico,podemoscrearrectngulos,crculos,etc...comocopiasde
prototipos.Estosobjetosgrficospertenecernaunajerarquacuyasclasesderivadas
implementarnelmecanismodeclonacin.
Aplicabilidad: Este patrn resulta til en escenarios donde es preciso abstraer la lgica que
decide qu tipos de objetos utilizar una aplicacin, de la lgica que luego usarn esos
objetosensuejecucin.
Composicin,creacinyrepresentacindeobjetosdebedesacoplarsedelsistema.
Lasclasesquesecrearnsonespecificadasenlaejecucin
Senecesitaesconderlacomplejidaddecrearnuevasinstanciasdelcliente.
Crearunobjetoesunaoperacincostosayesmseficientecopiarunobjeto.
Objetosquesonsimilaresaotrosobjetosyaexistentes,sonnecesarios.
Estructura:
14
Participantes:
Client:Eselencargadodesolicitarlacreaciondelosnuevosobjetosapartirdelos
prototipos.
Prototype:Declaraunainterfazparaclonarse,alaqueaccedeelcliente.
ConcretePrototype:Poseecaractersticasconcretasquesernreproducidaspara
nuevosobjetoseimplementaunaoperacinparaclonarse.
Colaboracin:Elclientesolicitaalprototipoqueseclone.
Consecuencias:
Beneficios
Aplicarelpatrnprototipopermiteocultarlasclasesproducto(prototipos
concretos)delclienteypermitequeelclientetrabajeconestasclases
dependientesdelaaplicacinsincambios.
Haceposibleaadiryeliminarproductosentiempodeejecucinalinvocarala
operacinclonar,loquesuponeunmtodoqueproporcionaunaconfiguracin
dinmicadelaaplicacin.
Permitelaespecificacindenuevosobjetosgenerandounobjetoconvalores
pordefectosobreelqueposteriormentesepodrnaplicarcambios.
Reduccindelnmerodesubclases
Desventajas
Lajerarquadeprototiposdebeofrecerlaposibilidaddeclonarunelementoy
estaoperacinpuedenosersencilladeimplementar
Silaclonacinseproducefrecuentemente,elcostepuedeserimportante.
Implementacin:LainterfazPrototypedeclaraunmtodoparaclonarseasmismo,
mientrasqueConcreteProtoypeimplementalaoperacinparaclonarseasmismo.
Enlaprcticanormalmenteseagregaunregistroparaadministrarlabsquedayclonacin
deobjetos.
Ejemplo:
UsosConocidos:
15
java.lang.Object#clone()(theclasshastoimplementjava.lang.Cloneable)
Patronesrelacionados:AbstractFactorypodraalmacenarunsetdePrototypesdelos
cualesclonaryretomarobjetos.
PATRONES ESTRUCTURALES
Laprincipalpreocupacindelospatronesestructuralesesrelacionadaconcmolasclases
ylosobjetosestncompuestosparaformarestructurasmayores.Msquecrearinterfaceso
implementaciones,estospatronesdescribenformasparacomponerobjetosquecuenten
connuevasfuncionalidades.Estoledaunamayorflexibilidaddecomposicindeobjetos
puespuedecrearlosentiempodeejecucin.
Adapter
Nombre:Adapter
Clasificacin:Estructural
Intencin:Convertirlainterfazdeunaclaseenotraqueelclienteespera.
Tambinconocidocomo:Wrapper
Motivacin: A veces una kit de bibliotecas de herramientas o clase no se puede utilizar
porquesuinterfazesincompatibleconlainterfazrequeridaporunaaplicacin
No podemos cambiar la interfaz de biblioteca, ya que puede que no tengamos su
cdigofuente
Incluso si tuviramos el cdigo fuente, es probable que no deberamos cambiar la
bibliotecaparacadaaplicacinespecficadeldominio
Ofrecer una nueva interfaz para los componentes existentes de legado (ingeniera,
reingenieradeInterfaz).
Aplicabilidad:
Cuando se desea usar una clase existente, y su interfaz no se iguala con la
necesitada.
Cuando se desea crear una clase reusable que coopera con clases no relacionadas,
esdecir,lasclasesnotienennecesariamenteinterfacescompatibles.
Estructura:
EstructuraObjectAdapter
16
EstructuraClassAdapter
Participantes:
Target:InterfazespecficadeldominioqueClientutiliza.
Client:ColaboraconlaconformacindeobjetosparalainterfazTarget.
Adaptee:Defineunainterfazexistentequenecesitaadaptarse.
Adapter:AdaptalainterfazAdapteealainterfazTarget.
Colaboracin: Client llama a las operaciones sobre una instancia Adapter. De hecho, el
adaptadorllamaalasoperacionesdeAdapteequellevanacaboelpedido.
Consecuencias:Losadaptadoresdeclaseyobjetostienendiferentestradeoff
Unadaptadordeclase:
17
Adapta Adaptee a Target encargando a una clase Adaptee concreta.
Como consecuencia, una clase adaptadora no funcionar cuando se
deseaadaptarunaclaseytodassussubclases.
Permite a los Adapter sobrescribir algo de comportamiento de Adaptee,
yaqueAdapteresunasubclasedeAdaptee.
Unadaptadordeobjeto:
Permite que un nico Adapter trabaje con muchos Adaptees, es decir,
el Adapter por s mismo y las subclases (si es que la tiene). El Adapter
tambin puede agregar funcionalidad a todos los Adaptees de una sola
vez.
Hace difcil sobrescribir el comportamiento de Adaptee. Esto requerir
derivar Adaptee y hacer que Adapter se refiera a la subclase en lugar
quealAdapteeporsmismo.
AquhayotrascuestionesaconsiderarcuandoseutilizaelpatrnAdapter:
1. Cunta adaptacin hace el Adapter? Adapter vara en la cantidad de trabajo que
hace para adaptar Adaptee a la interfaz Target. Hay un espectro de trabajo posible,
desde una simple conversin (por ejemplo, cambiando los nombres de las
operaciones) hasta soportando un conjunto de operaciones enteramente diferentes.
La cantidad de trabajo que Adapter hace depende de cuanto de similar tienen la
interfazTargetconAdaptee.
2. Adaptadores Pluggables Una clase es ms reusable cuando se minimiza la
suposicin de que otras clases deben utilizarla. Mediante la construccin en una clase
de la adaptacin de una interfaz, se elimina la suposicin de que otras clases ven la
misma interfaz. Dicho de otra manera, la adaptacin de la interfaz nos permite
incorporar a nuestra clase en sistemas existentes que pueden esperar diferentes
interfacesdelamisma.
Implementacin:
Crear una nueva clase que ser el Adaptador, que extienda del componente existente e
implemente la interfaz obligatoria. De este modo tenemos la funcionalidad que queramos y
cumplimoslacondicindeimplementarlainterfaz.
La diferencia entre los patrones Adapter y Facade, es que el primero reutiliza una interfaz ya
existente,mientrasqueelsegundodefineunanuevaconelobjetivodesimplificarla.
Ejemplo:
Target:
public interface VehiculoCarreras {
public void correr();
...
}
Clasesvlidas:
public class CitroenCarreras extends vehiculoCarreras {
public void correr() {
...
}
18
}
public class OpelCarreras extends vehiculoCarreras {
public void correr() {
...
}
}
Adaptee:
public class Renault {
public void arranca() {
...
}
public void meterPrimera() {
...
}
public void acelerar() {
...
}
...
}
Adapter
public class RenaultCarrerasWrapper extends VehiculoCarreras {
public void correr() {
...
renault.arranca();
renault.metePrimera();
renault.acelera();
...
}
}
Client
public class Main() {
public static void main(String[] args) {
VehiculoCarreras vc = new CitroenCarreras();
vc.correr();

vc = new OpelCarreras();
vc.correr();

// vc = new Renault(); No es posible hacer esto
vc = new RenaultCarrerasWrapper();
vc.correr();
}
}
UsosConocidos:
ClasesadaptadorasdelJDK
19
ParagestionareventosunobjetodebeimplementarEventListener
ParagestionareventosdeobjetosdetipoWindowdebeimplementarlainterfaz
WindowListenerqueextiendeEventListener
WindowListenertienesietemtodos,peroenmuchasocasionesslonoseusan
msdetres,esposibleevitarladefinicindeclasesderivadasdeWindowListener
quenoaadencomportamientoparalamayoradelosmtodos?
ElJDKproporcionalaclaseabstractaWindowAdapterparadichofin
Patronesrelacionados:
Bridge: separa una interfaz de su aplicacin, de manera que pueda variar
fcilmenteydeformaindependiente.
Decorator:noalteralainterfaz,peroagregaresponsabilidad.
Proxy:defineunrepresentanteosustitutodeotroobjetosincambiarsuinterfaz.
Facade:hacequeunainterfazseamssimple.
Bridge
Nombre:Bridge
Contexto: En programacin orientada a objetos es usual crear una implementacin a partir
deunainterfaceoabstraccin,yluegolosclientesrealizansolicitudesalaimplementacin.
Problema: Esto crea un enlace permanente entre la abstraccin y su implementacin,
dificultando que la implementacin pueda ser seleccionada o cambiada en tiempo de
ejecucin,requiriendolarecompilacinhastaelcliente.
Solucin: Por lo tanto, surge el patrn Bridge (Handle/Body) que permite separar las clases
abstractas de sus implementaciones, de tal manera que ambas puedan ser modificadas
independientemente. De esta forma se evita un enlace permanente entre la abstraccin y su
implementacin, se permite realizar cambios en la implementacin de una abstraccin sin
impactar en los clientes, es decir, su cdigo no debe tener que ser recompilado. Adems se
esconde la implementacin de una abstraccin completamente a los clientes. Tanto las
abstracciones como sus implementaciones deben ser extensibles por medio de subclases.
En este caso, el patrn Bridge permite combinar abstracciones e implementaciones
diferentesyextenderlasindependientemente.
Bridge desacopla interfaz e implementacin: una implementacin no es limitada
permanentemente a una interface. La implementacin de una abstraccin puede ser
configurada en tiempo de ejecucin. Fomenta las capas, que pueden conducir a un sistema
mejor estructurado. La parte de alto nivel de un sistema slo tiene que conocer Abstraction e
20
Implementor. Bridge mejora la extensibilidad: se puede extender las jerarquas de Abstraction
eImplementorindependientemente.
Elementos:
Abstraction
Definelainterfazdelaabstraccin
MantieneunareferenciaaunobjetodetipoImplementor
RefinedAbstraction
Implementalainterfazdefinidaporlaabstraccin(Abstraction)
Implementor
Define la interfaz para las clases de la implementacin, no tiene que corresponder
exactamenteconlainterfazdelaabstraccin,inclusopuedensercompletamentediferentes.
ConcreteImplementorA
ImplementalainterfazdefinidaenlaclaseImplementor
ConcreteImplementorB
ImplementalainterfazdefinidaenlaclaseImplementor
PuedehaberNimplementacionesconcretas

Overview/Relaciones:
Composite
Nombre:Composite
Clasificacin:Estructural
21
Intencin: Compone objetos en estructura de rbol y los representa en jerarquas parte todo.
Dejaalosusuariosmanejarobjetossimplesycompuestosuniformemente
Tambinconocidocomo:
Motivacin:
Editores grficos dejan a los usuarios trabajar con diagramas simples y compuestos. Los
usuarios pueden crear grupos compuestos a partir de una lista de componentes, que son
agrupados para formar componentes mayores. Una simple implementacin sera un grupo
de clases que definen grficas primitivas tales como texto y lneas, y otras clases diferentes
actan como contenedoras de estas primitivas pero trabajar de esta manera genera un
problema un cdigo que use estas clases debe tratar objetos primitivos y compuestos por
separado, an si la mayora de veces las trata idnticamente. Esta distincin hace ms
complejo el sistema, el patrn de diseo composite ofrece una forma de manejar objetos
compuestossinqueelusuariotengaquehacerladistincin.
La clave del patrn composite es una clase abstracta, que es la clase padre tanto de objetos
simples, como los compuestos. Esta clase incluye mtodos para objetos simples y tambin
para los compuestos. Las clases primitivas (simples) no implementan los mtodos de la
clase abstracta que actan sobre los componentes de un objeto (porque son objetos
simples) por su lado las clases contenedoras (compuestas), si trabajan todos los mtodos.
En el patrn los objetos individuales (simples), son las hojas de un rbol, y los compuestos
sonnodosquecontienenlashojasquesederivandeellos
Aplicabilidad:
Usecompositecuando:
Quiererepresentarobjetosdejerarquaspartetodo.
22
Quiere que el cliente ignore entre objetos compuestos y objetos individuales, con el
objetivodetratarlosgenricamente.
Estructura:
Participantes:
Component: Declara la interfaz para objetos en composicin. Implementa
comportamiento comn para todas las clases. Declara puntos para acceder y
manejarlasclasesleaf.
Leaf: representa las hojas en un rbol de composicin, estas clase s representan
objetosindividuales.
Composite: Define el comportamiento para objetos compuetos. Se componen de
clases leaf. Implementa los mtodos para el manejo y acceso definidos en la clase
abstractacomponent.
Colaboracin:
El cliente interacta con component, para utilizar objetos de la estructura de composite, s el
objeto es una hoja (leaf), la interaccin es directa, si el objeto es un compuesto (composite),
ste enva peticiones a sus objetos hijos, posiblemente ejecutando operaciones adicionales,
antesodespusdelasolicitud.
Consecuencias:Elpatrncomposite:
Define jerarquas de clases consistentes en objetos simples y compuestos. Los
objetos simples pueden componer objetos complejos, que pueden componer otros
objetos,yassucesivamente.Elclientepuedesolicitarobjetossimplesycompuestos.
23
Simplifica el cliente.los clientes pueden tratar objetos compuestos y objetos simples
independientemente, el cliente normalmente no sabe si se relaciona con un objeto
simpleounocompuesto.
Facilitalaadicindenuevotiposdecomponentes.
Puede hacer el diseo excesivamente general. Lo cual constituye una desventaja
debidoaqueesdifcilrestringirloscomponentesdeunobjetocompuesto.
Implementacin:
Sedebenconsiderarmuchassituacionescuandoseimplementaelpatrncomposite:
Referenciasexplcitasalospadres.
Compartircomponentes.
MaximizarlainterfaceComponent.
Declararlasoperacionesdemanejodehijos.
ImplementaraComponentunalistadecomponentes?.
Ordendeloshijos.
Cachingparamejorarelrendimiento.
Quinborraracomponentes?.
Culeslamejorestructuradedatosparaalmacenarcomponentes?.
Ejemplo:
Se quiere construir un editor de expresiones matemticas. Especificar el diagrama de clases
que permita representar expresiones vlidas. Una expresin vlida estar formada o bien por
unnmero,obienporlasuma/resta/divisin/multiplicacindedosexpresiones
Ejemplosdeexpresionesvlidas:4
3+8
14*(3+5)...
24
Usos Conocidos: Ejemplos de composite se encuentran en todos los sistemas orientados a
objetos.Elvisordeclasesoriginaldesmalltalkfueuncomposite.
Patronesrelacionados:
Chain of responsability se utiliza en combinacin con el patrn composite cuando hay
quepropagarlosmtodoshaciaarriba,enelrboldesdelashojashastalosnodos.
Flyweightpermitecompartircomponentesoobjetosprimitivosencomposite.
Iterator puede ser utilizado para encapsular el recorrido de los coposite (objetos
complejos).
Visitor centraliza operaciones y comportamientos que de otra manera tendran que
serdivididosenlashojasyloscomposite.
Decorator
Nombre:Decorator.
25
Clasificacin:Estructural.
Intencin:Agregardinmicamenteresponsabilidadesadicionalesaunobjeto.Esuna
alternativaflexibledecrearsubclases.
Tambinconocidocomo:Wrapper.
Motivacin:Estepatrnsepuedeutilizarcuandosequiereextenderlafuncionalidaddeun
objetodeformaestaticaodinmica.Estoselograconeldiseodeunaclasedecoradora
queenvuelvaalaclaseoriginal.Porejemplo,paraagregarfuncionalidadaunaventana
grficaesconvenienteutilizarelpatrndecoratorporquedeestaformaselepuedeagregar
dinmicamenteunscrollhorizontal,scrollvertical,bordes,etc.
Aplicabilidad:
Paraaadirobjetosindividualesdeformadinmicaytransparente.
Retirarresponsabilidadesdelaclaseyagregarlasalobjeto.
Cuandonoesposiblehacerunaextensinporsubclases.
Estructura:
Participantes:
Component.Definelainterfazparalosobjetosquepuedentenerresponsabilidades
aadidas.
ConcreteComponent.Deneunobjetoalcualselepuedenagregardinmicamente
responsabilidadesadicionales.
Decorator.Implementalainterfazdelcomponentequesevadecorar.
ConcreteDecorator.Agreganresponsabilidadesalcomponente.
26
Colaboracin:
Seencapsulaelobjetoenelobjetodecoradorquetendrlamismainterfaz.Deesta
formaeldecoradorestransparentealosclientes.
Eldecoradorreenvalassolicitudesalobjetomientrasejecutaaccionesadicionales
antesdereenviarlas.
Consecuencias:
Haymsflexibilidadqueconunaherenciaesttica.
Esconvenienteparaagregarfuncionalidadesalobjetoenlugardelaclase.
Esposibleremoverlasfuncionalidadesqueseagregandinmicamente.
Hacerdebugdelaaplicacionpuedeserdifcilporquelafuncionalidadesagregada
dinmicamentedurantelaejecucin.
Implementacin:
1. DividirlaclaseComponentenunasubclasellamadaDecorator.
2. EnlaclaseDecoratoragregaruncampoquesirvadereferenciaalaclase
Component.
3. PasarelcomponentealconstructordelaclaseDecoratorparainicializarelobjeto.
4. EnlaclaseDecoratorredireccionartodoslosmtodosdelaclaseComponental
objetodereferencia.
5. EnlasclasesConcreteDecoratorsobrescribircadamtodoquenecesitequesu
comportamientocambie.
UsosConocidos:GUItoolkits
Patronesrelacionados:
Adapter.Eldecoratorcambialasresponsabilidadesdelobjeto,mientrasqueel
adaptercambialainterfazdelobjeto.
Composite.Eldecoratorpuedeservistocomouncompositedegeneradoconunsolo
componente.
Facade
Nombre:Facade
Clasificacin:Estructural
Intencin:Simplificarlasrelacionesexistentesentrelosobjetos,reduciendoelnmerode
actoresenlasmismasmedianteelusodeunafachadaqueexponelalgicaacompartir
Tambinconocidocomo:
Motivacin:escenarioilustrativomostrandocmosolucionaunproblemaelpatrn.
27
Aplicabilidad:Escomnmenteusadoenarquitecturasorientadasaservicioscomopor
ejemplowebservices,dondeunwebservicepuedeproveeraccesoaunnmerodeotros
serviciosocultosparaelinvocadorparaporelfacade.
Estructura:
Participantes:
Facade: Conoce que clases son responsables de una peticin delega las peticiones
delclientealosobjetosdelsubsistemaapropiado.
Subsystem Classes: Implementa la funcionalidad del subsistema maneja el trabajo
asignadoporFacadeNotienenrelacinconFacade.
Colaboracin:
ClientSubsystem: Los clientes se comunican con el subsistema enviando
peticiones a la fachada, quien los reenva al subsistema apropiado. El Facade puede
tener que hacer un trabajo propio para traducir su interfaz a las interfaces del
subsistema.
El objetivo es evitar que los clientes que utilizan la fachada puedan acceder a los
subsistemasdirectamente(aunquepodraimplementarseunFacadeopcional).
28
Consecuencias:
Consecuenciaspositivas:
Protegealclientedeloscomponentesdelsubsistema.
Promueveunacoplamientodbilentreelclienteyelsubsistema.
Noevitaqueseutilicenclasesdelsubsistemasiasserequiere.
Consecuenciasnegativas:
Se debe de tener especial cuidado si se requieren hacer cambios a los
subsistemasyaquecualquiercambiomayorromperlafachada.
En algunos casos puede que varios clientes necesiten acceder a
subconjuntos diferentes de la funcionalidad que provee el sistema, podra
acabar usando slo una pequea parte de la fachada, por lo que sera
conveniente utilizar varias fachadas ms especficas en lugar de una nica
global.
Implementacin:
Reducir el acoplamiento del cliente y los subsistemas. Para ello, el Facade podra ser
unaclaseabstracta.
Se puede elegir entre mantener pblicos a los subsistemas, de modo que sean
accesibles tanto directamente como mediante el Facade, o convertirlos en privados y
slo dejar que el Facade les delegue responsabilidades. Esto ltimo podra provocar
que el cliente termine utilizando muchas menos funciones o se encuentre limitado a
lasaccionesquepuederealizarslomedianteelFacade.
Ejemplo:
Subsystemclasses:
public class Circle {
public void draw() {
...
}
}
public class Square {
public void draw() {
...
}
}
public class Rectangle {
public void draw() {
...
}
}
Facade:
public class ShapeProducer() {
private Circle circle;
private Square square;
private Rectangle resctangle;

29
public void drawCircle() {
circle = new Circle();
circle.draw();
}

public void drawSquare() {
square = new Square();
square.draw();
}

public void drawRectangle() {
rectangle = new Rectangle();
rectangle.draw();
}
}
Client
public class Client {
public static void main(String[] args) {
ShapeProducer sp = new ShapeProducer();
sp.drawCircle();
sp.drawSquare();
sp.drawRectangle();
}
}
UsosConocidos:
SistemasOperativos
Webservicesengeneral
Patronesrelacionados:
Singleton dado que en determinadas ocasiones las fachadas pueden ser instancias
nicas.
SepuedecombinareinclusopuedereemplazaralAbstractFactory.
Es muy parecido al Mediator Pattern, ya que ambos abstraen la funcionalidad de
clases existentes. La diferencia se encuentra en que el Facade no define nueva
funcionalidad y los subsistemas no conocen al Facade, como si lo puede hacer un
Mediator.
Flyweigth
Nombre:Flyweight
Clasificacin:Estructural
Propsito:Usocompartidoparaeficientizargrandescantidadesdeobjetoscongranularidad
fina.
30
Tambinconocidocomo:
Motivacin:
Algunasaplicacionessepuedenbeneficiardelusodeobjetosatravsdetodoeldiseodela
aplicacin,sinembargoenimplementacin,estopudieraresultaraltamentecostoso.El
patrnflyweightdescribecmocompartirobjetosparapermitirsuusoengranulacionesfinas
singeneraruncostoqueimpidasurealizacin.
Unflyweightesunobjetocompartidoquepuedeserusadoencontextosmltiples,demanera
simultnea.Actacomounobjetoindependienteencadacontextoperolaclavees
diferenciarentresuestadointerno/externo.
Interno:Elestadoesalmacenadoenelflyweight,nodependedelcontextoenelque
seencuentraelobjeto.Porlotanto,sepuedecompartir.
Externo:Elestadodependedelcontextoenelqueseencuentraelobjeto,porlotanto
nopuedeseralmacenadoporelflyweightynosepuedecompartir.
Aplicabilidad:
Laefectividaddeestepatrndependealtamentedecundoycmoesusado.Elpatrn
aplicacuandotodaslasafirmacionessiguientessonciertas:
Laaplicacinutilizaungrannmerodeobjetos.
Loscostosdealmacenamientosonaltosdebidoalgrannmerodeobjetos.
Lamayoradelosestadosdelobjetossepuedenhacerexternosynoesenciales.
Gruposdemuchosobjetossepuedenreemplazarporrelativamentepocosunavez
quelosestadosexternossonremovidos.
Laaplicacinnodependedelaidentidaddelosobjetos,porlotantosepueden
compartirlosobjetosflyweight.
Estructura:
Participantes:
31
Flyweight(interfaz):Declaralainterfazdelobjeto.
Flyweightconcreto(implementacin):Agregaelestadointrinsecopormediodeuna
implementacindelainterfaz.
Flyweightnocompartido:Notodaslasimplementacionesdeflyweightnecesitanser
compartidas.Lafuncincompartidaespermitida,noforzada.
FabricadeFlyweight:Creayadministralosobjetosflyweight.Seaseguradequeson
compartidosdemaneraapropiada.
Cliente:Mantieneunareferenciaalosflyweights.
Colaboracin:
Elestadoqueutilizaelflyweightdebedeclararsecomoexternoointerno.Internoo
IntrinsecosedeclaradentrodelFlyweightconcretoelestadoexternosealmacenay
procesaporenelClienteylopasaalobjetocuandoloinvoca.
LosclientesdebenllamaralosFlyweightsconcretosdesdeelobjetofbrica,para
asegurarquesecompartancorrectamente,nollamarlosdirectamente.
Consecuencias:
Elusodeflyweightsintroducecostosdeejecucinasociadosatransferir,encontraro
procesaselestadointernode
Implementacin:
Esimportanteconsiderarlosiguientecuandoseimplementaestepatrn:
Removerelestadoextrinseco.Laaplicabilidaddeestepatrnestaltamente
relacionadaconquetanfcilesidentificardichoestadoyremoverlodelosobjetos
compartidos.
Administrarobjetoscompartidos.Losobjetosalsercompartidosnopuedenser
instanciadosdirectamente.Lafbricadeflyweightsayudaacrearlosyapoyaalcliente
paraencontrarlos.Peroencasodemanejargrandescantidadesdeobjetosflyweight
debehaberunbuenmanejodelasreferenciasparapermitiralgarbagecollector
eliminarlos.
Ejemplo:

classGlyph{
public:
virtual~Glyph()
virtualvoidDraw(Window*,GlyphContext&)
virtualvoidSetFont(Font*,GlyphContextk)
virtualFont*GetFont(GlyphContext&)
virtualvoidFirst(GlyphContext&)
virtualvoidNext(GlyphContext&)
virtualboolIsDone(GlyphContext&)
virtualGlyph*Current(GlyphContextk)
32
virtualvoidInsert(Glyph*,GlyphContext&)
virtualvoidRemove(GlyphContextk)
protected:
Glyph()
}
classCharacter:publicGlyph{
public:
Character(char)
virtualvoidDraw(Window*,GlyphContext&)
private:
char_charcode
}
UsosConocidos:
Editordetexto.
DarindependenciaalLook&Feelunwidgetdelegatodosulook&feelalaclasede
Layout(shadow,beveling),peroconservalafuncionalidadcomn(scroll,botones,
etc)
Patronesrelacionados:
ElpatrnFlyweightgeneralmentesecombinaconelpatrnCompositeparaimplementaruna
estructurajerrquicaentrminosdeungrafodirigidoyacclicoconnodoscompartidos.
Generalmente,esbuenaideaimplementarlosobjetosFlyweightenbasealospatronesState
yStrategy.
PATRONES DE COMPORTAMIENTO
Lospatronesdecomportamientoestnenfocadossobrelosalgoritmosylaasignacinde
responsabilidadesentreobjetos.Estospatronesnosolodescribenpatronesdeclasesu
objetos.Tambindescribenpatronesdecomunicacinentreellos.
Lospatronesdecomportamientocaracterizanlosflujosdecontrolcomplejosqueson
difcilesdeseguirentiempodeejecucin.Ayudanacambiarelpuntodeenfoquededichos
flujosdecontrolparaconcentrarseencmolosobjetosestninterconectados.
Chain of Responsibility
Nombre:ChainofResponsibility
Clasificacin:Comportamiento
33
Intencin:Evitaacoplarelemisordeunapeticinasureceptordandoamsdeunobjetola
posibilidadderesponderaunapeticin.
Tambinconocidocomo:
Motivacin:
SetienealaempresaAllGamesquealanzadorecientementesumsnovedosovideojuego.
Debidoalxitodeljuegolacompaarecibemuchomscorreodelhabitual,ademsde
spamcombinado.Eltenerquefiltrarcadatipodecorreo(spam,fanticos,quejas,nuevos
socios)sehavueltocomplicado.EldepartamentodeTItieneunbrevedesarrollodeIApara
detectoreltipodecorre,porloquesehadecididodesarrollarunaclaseysubclasespara
facilitarelmanejodetodo.
Secreaunobjetoparacadatipodecorreoysecreaunacadenadeobjetosqueanalizara
cadacorreo.
Cuandollegauncorreopasaalprimerobjetosiestenocoincideentoncespasaalsiguiente,
assucesivamentehastaqueterminalacadenasinosehaencontradounlugardentrodela
cadenaelcorreosedesecha,obienopcionalmentesepuedecrearunobjetoqueacepte
todotipodecorreos.
Aplicabilidad:Seutilizacuando:
Haymsdeunobjetoquepuedemanejarunapeticin,yelmanejadornose
conoceapriori,sinoquedeberadeterminarseautomticamente.
Sequiereenviarunapeticinaunobjetoentrevariossinespecificar
explcitamenteelreceptor.
Elconjuntodeobjetosquepuedentratarunapeticindeberaserespecificado
dinmicamente.
Estructura:
34
Participantes:
Handler:Defineunainterfazparamanejarlaspeticionesdelcliente.Opcionalmente,
implementaelenlacealsucesor.
ConcreteHandler:ProcesalaspeticionesquelecorrespondenSi
ConcreteHandler1nopuedeprocesarlapeticin,estereenvalapeticinaConcrete
Handler2yassucesivamentehastaqueterminelacadena.
Cliente:InicializalapeticinaunConcreteHandlerdelacadena.
Colaboracin:Cuandounclienteenvaunapeticin,dichapeticinviajaatravsdela
cadenadeConcreteHandlershastaencontrarunoquepuedaprocesarlapeticin,encaso
contrarioestasedesechaosepuedeusarunmanejadoruniversal.
Consecuencias:
Beneficios
Desacoplaelclientedelmanejadordelaspeticiones.
Simplificalosobjetosporque,notienequesaberlaestructuradelacadenay
mantienereferenciasdirectasasusintegrantes.
Permiteagregaroremoverresponsabilidadesdinmicamentealcambiarlos
integrantesoelordendelacadena.
Desventajas
Laejecucindelapeticinnoestgarantizadapuedecaerfueradelacadena
sisellegaalfinalynoseencontraronunobjetoparamanejarlapeticin.
PuedeserdifcilobservarlascaractersticasdeejecucinyhacerDebug.
Implementacin:
Implementacin de la cadena sucesora : Hay dos formas posibles de
implementarla:
1. Definir nuevos enlaces (normalmente en el Handler, pero tambin
podraserenlosobjetosConcreteHandler).
35
2. Usarenlacesexistentes(otrasasociacionesexistentes).
Conexin de los sucesores: Si no hay referencias preexistentes para
definir una cadena, entonces tendremos que introducirlas nosotros
mismos. En este caso, el Manejador define la interfaz y adems, se
encarga de mantener el sucesor. Esto permite que el manejador
proporcione una implementacin predeterminada de HandleRequest que
reenve la peticin al sucesor (si hay alguno). Si una subclase de
ConcreteHanlder no est interesada en dicha peticin, no tiene que
redefinirlaoperacindereenvo.
Representacin de peticiones: Hay varias opciones para representar las
peticiones:
1. Una peticin es una invocacin a una operacin insertada en el cdigo.
Esto resulta conveniente y seguro, pero slo se pueden reenviar el
conjuntoprefijadodepeticionesquedefinelaclaseManejador.
2. Una nica funcin manejadora que reciba un cdigo de peticin como
parmetro. Esto permite un nmero arbitrario de peticiones pero
emisor y receptor deben ponerse de acuerdo sobre cmo codificar la
peticin.
UsosConocidos:Loscajerosautomticosutilizanelpatrndecadenaderesponsabilidad,
paracontareldineroquesevaaentregar.
java.util.logging.Logger#log()
javax.servlet.Filter#doFilter()
Command
Nombre:Command
Clasificacin:Comportamiento
Propsito:Permitehacerunaoperacinaunobjetosinconocerelcontenidodela
operacinnidelreceptor.Encapsulalapeticincomounobjetoyfacilitalaparametrizacin
delosmtodos.
Tambinconocidocomo:ProducerConsumerpattern
Motivacin:Estepatrnsepuedeutilizarcuandosequieraimplementarunsistemabasado
encomandosdeunaformasencillayverstilyaquefacilitasuusoyampliacin.
Enocasionessequierepoderenviarsolicitudesaobjetossinconocerexactamentela
operacinsolicitadanidelreceptordelasolicitud.Engeneralunobjetobotnomenejecuta
solicitudesperolasolicitudnoestimplementadadentrodelmismo.
36
Aplicabilidad:
Permitirdeshacer.
Registrarcambios.
Parametrizarobjetosconunaaccinarealizar.
Ponercolayejecutarpeticionesendiferentesperiodosdetiempo.
Desacoplarelobjetoqueinvocalaaccindeotroobjetoquerealizalaaccin.
Estructura:
Participantes:
Command.Definelainterfazparaejecutarunaoperacinn.
ConcreteCommand.ExtiendedelainterfazCommand,implementaelmtodo
ExecutealinvocarlasoperacionescorrespondientesenelReceiver.Defineunlink
entreelReceiverylaaccin.
Client.CreaunConcreteCommandydefinesuReceiver.
Invoker.HacequeelCommandlleveacabounapeticin.
Receiver.Sabecomorealizarlasoperaciones.
37
Colaboracin:
Enlasiguienteimagensemuestralacolaboracinentrelosobjetos.

Consecuencias:
LainterfazCommanddesacoplaelobjetoqueinvocalaoperacindelobjetoquesabe
comoejecutarlaoperacin.
Loscomandossonobjetosdeprimeraclase.
Esfacilaadirnuevoscomandos.
Implementacin:
1. ElclientecreaunConcreteCommandydefineelreceptor.
2. ElobjetoinvocadorguardaelobjetoConcreteCommand.
3. ElinvocadorcreaunasolicitudllamandoelmetodoExecutedelCommand.
4. ElobjetoConcreteCommandinvocalasoperacionesenelreceptorparaejecutarlas
solicitudes.
UsosConocidos:LasclasesButtonyMenuItemdeJavafacilitanlautilizacindeeste
patrn,declaranlosmtodosgetActionCommandysetActionCommandparadarnombresa
lasaccionesrealizadasporlosobjetos,facilitandounacorrespondenciaentreambos.
Interpreter
Nombre:Interpreter
Clasificacin:Comportamiento
Propsito:Dadounlenguaje,defineunarepresentacindesugramticajuntoconun
intrpretequeutiliceesarepresentacinparainterpretarlasinstruccionesdellenguaje.
Tambinconocidocomo:
Motivacin:Cuandounprogramapresentarepetidamentenmeroscasospuedeser
convenienteutilizarunlenguajesimplequedescribaesoscasoytenerunprogramaque
38
interpreteellenguaje.Porejemplo:expresionesregulares.
Aplicabilidad:
Cuandohayunlenguajequesequierainterpretarsesepuedanrepresentarlas
sentenciascomorbolesdeanlisissintctico.
Lagramaticaessimple.
Laeficiencianoesunapreocupacioncrtica.
Paraagregarfuncionalidadalpatrncomposite.
Ruleengines.
Estructura:
Participantes:
AbstractExpression.Declaraunainterfazparaejecutarlaoperacin.
TerminalExpression.Implementaunaoperaciondelinterpreteasociadaconun
simboloterminaldelagramatica.
NonTerminalExpression.Implementaunaoperacindelinterpreteasociadacon
smbolosnoterminalesdelagramtica.
Context.Contieneinformacinqueesglobalparaelintrprete.
Client.Creaunrboldeanlisissintcticoquerepresentaunasentenciaparticulardel
lenguajequedefinelagramtica.
Colaboracin:
Elclientecreaunrboldeanlisissintctico.DespusselclienteinicializaelContext
39
delintrpreteeinvocaelmtodointerpret.
Encadanodonoterminal,losmtodosdeinterpretusanelcontextoparaguardary
accederalestadodelinterpreter.
Consecuencias:
Esfacilcambiaryampliarlagramtica.
Facildeimplementar.
Lasgramticascomplejassondifcilesdemantener.
Sepuedeaadirnuevosmodosdeinterpretarexpresiones.
Implementacin:
Elpatrninterpreternoespecificacmosedebecrearelarboldeanalisissintactico.
SepuedeunParser.
DefinirlosmtodosinterpretutilizandoelpatrnVisitorycompartirlossmbolosno
terminalesconelpatronFlyweight.
UsosConocidos:
Validacindereglas.
Convertidordeexpresiones.Ejemplo:nmerosromanos.
Patronesrelacionados:
Compositeparacrearelrboldeanlisissintctico.
Visitorparamoverlasoperacionesdelosnodosdeunarbolanlisisdesintcticoen
unasolaclase.
Flyweightparacompartirsmbolosterminales.
Iteratorpararecorrerlosnodosnoterminales.
Mediator
Nombre:Mediator
Contexto: En programacin orientada a objetos se promueve la distribucin de
comportamiento entre objetos ya que al dividir un sistema en muchos objetos suele mejorar
lareutilizacin,perolasinterconexionesentreobjetosaumentanlacomplejidad.
Problema: Al tener una estructura de objetos con muchas conexiones, dificulta cambiar el
comportamiento del sistema ya que el comportamiento se encuentra distribuido en muchos
objetos.
Solucin:
Con el patrn mediador, la comunicacin entre objetos es encapsulada con un objeto
mediador. Los objetos no se comunican de forma directa entre ellos, en lugar de ello se
comunican mediante el mediador. Esto reduce las dependencias entre los objetos en
comunicacin,reduciendoentonceslaDependenciadecdigo.
40
Esaplicablecuando:
Unconjuntodeobjetossecomunicandeformabiendefinida,perocompleja.
Las interdependencias resultantes no estn estructuradas y son difciles de
comprender
Es difcil reutilizar un objeto, ya que ste se refiere a otros muchos objetos, con los
quesecomunica
Un comportamiento que est distribuido entre varias clases debera poder ser
adaptadosinnecesidaddeunagrancantidaddesubclases.
Elementos:
Mediador
DefineunainterfazparacomunicarseconsusobjetosColega
MediadorConcreto
ImplementaelcomportamientocooperativocoordinandoobjetosColega
ConoceasusColegas
ClasesColega
CadaclaseColegaconoceasuobjetoMediador
CadaColegasecomunicaconsumediador.

Overview/Relaciones:
Ejemplo:
packageCodigo_Mediator

importjava.awt.Font
importjava.awt.event.ActionEvent
importjava.awt.event.ActionListener
importjava.util.Vector

importjavax.swing.JButton
importjavax.swing.JFrame
importjavax.swing.JLabel
importjavax.swing.JPanel
importjavax.swing.JTextField
41

/*
*MediadorAbstracto
*/
interfaceIMediador{
publicvoidaadirAlCalculo()
publicvoidmostrarResultado()
publicvoidcalcular()
publicvoidregistraBoton(Botonv)
publicvoidregistraCalculos(Calculosc)
publicvoidregistraDisplay(DisplayFieldd)
publicvoidregistraText(TextFieldt)
}

/*
*MediadorConcreto
*/
classMediadorimplementsIMediador{

Botonboton
Calculoscalculos
DisplayFielddisplay
TextFieldcajaTexto
doubleresultado=0

/*Elmediadorconocealosobjetoscolega*/
publicvoidregistraBoton(Botonb){
boton=b
}
publicvoidregistraDisplay(DisplayFieldd){
display=d
}
publicvoidregistraCalculos(Calculosc){
calculos=c
}
publicvoidregistraText(TextFieldt){
cajaTexto=t
}

/*CoordinalainteraccinentrelosobjetosColega*/
publicvoidaadirAlCalculo(){
calculos.aadir(newDouble(""+cajaTexto.getText()).doubleValue())
boton.setEnabled(false)
42
calcular()
}
publicvoidmostrarResultado(){
cajaTexto.setText("")
boton.setEnabled(true)
display.setText("Promedio:"+resultado)
display.setVisible(true)
}
publicvoidcalcular(){
boton.setEnabled(false)
resultado=calculos.calcularPromedio()
mostrarResultado()
}

/*
*InterfazdeColegas
*/
interfaceCommand{
voidexecute()
}

/*
*ColegaConcreto
*/
classBotonextendsJButtonimplementsCommand{

IMediadormed

Boton(ActionListeneral,IMediadorm){
super("AadiraListayCalcularPromedioGeneral")
addActionListener(al)

/*RegistraralColegaenelMediador*/
med=m
med.registraBoton(this)
}

publicvoidexecute(){
med.aadirAlCalculo()
}
}
43

/*
*SuperClaseOperacionesLgica/Calculos
*/
classOperaciones{
publicVectorv=null
publicdoubleresultado=0.0
publicOperaciones(){
v=newVector()
}
publicvoidaadir(doublenuevo){
v.add(nuevo)
}
}

/*
*ColegaConcreto
*/
classCalculosextendsOperacionesimplementsCommand{

IMediadormed

Calculos(IMediadorm){
/*RegistraralColegaenelMediador*/
med=m
med.registraCalculos(this)x
}
publicdoublecalcularPromedio(){
inttamanio=v.size()
for(inti=0i<tamanioi++){
super.resultado=super.resultado+newDouble(""+v.get(i)).doubleValue()
}
if(tamanio!=0)super.resultado=super.resultado/tamanio
elsesuper.resultado=0
returnresultado
}
publicvoidexecute(){
med.calcular()
}
}

/*
*ColegaConcreto
44
*/
classTextFieldextendsJTextFieldimplementsCommand{

IMediadormed

TextField(ActionListeneral,IMediadorm){
super("",10)
addActionListener(al)

/*RegistraralColegaenelMediador*/
med=m
med.registraText(this)
}

publicvoidexecute(){
//med.enter()
}
}

/*
*ColegaConcreto
*/
classDisplayFieldextendsJLabel{

IMediadormed

DisplayField(IMediadorm){
super("Salida",CENTER)
setFont(newFont("Arial",Font.BOLD,24))

/*RegistraralColegaenelMediador*/
med=m
med.registraDisplay(this)
}
}

publicclassMediatorextendsJFrameimplementsActionListener{

/*ObjetoMediador*/
IMediadormed=newMediador()

/*ObjetosColega*/
45
JButtonboton=newBoton(this,med)
Calculoscalculos=newCalculos(med)
JLabeldisplay=newDisplayField(med)
JTextFieldtext=newTextField(this,med)

Mediator(){
JPanelp=newJPanel()
display.setVisible(false)
p.add(text)
p.add(boton)
getContentPane().add(p,"North")
getContentPane().add(display,"South")
setSize(500,200)
setVisible(true)
}

publicvoidactionPerformed(ActionEventae){
Commandcomd=(Command)ae.getSource()
comd.execute()
}

publicstaticvoidmain(String[]args){
newMediator()
}
}
Observer
Nombre:Observer
Contexto: Cuando hay relaciones entre objetos o clases en ocasiones se requiere conocer
el comportamiento o estado de algunos objetos. Por lo que se implementan mtodos para
conocerestosestados.
Problema: Estos mtodos implican que se est revisando constantemente un objeto, lo que
generadependenciasybuclesdeactualizacin.
Solucin:
ElpatrnObservereslaclavedelpatrndearquitecturaModeloVistaControlador(MVC).
Esunpatrndediseoquedefineunadependenciadeltipounoamuchosentreobjetos,de
maneraquecuandounodelosobjetoscambiasuestado,notificaestecambioatodoslos
dependientes.ElpatrnObservertieneusosmuybsicosycomunes.Seutilizapara
monitorearcambiosenobjetosdinmicamente.
Elementos:
Sujeto(Subject):
46
El sujeto concreto proporciona una interfaz para agregar (attach) y eliminar (detach)
observadores.ElSujetoconoceatodossusobservadores.
Observador(Observer):
Define el mtodo que usa el sujeto para notificar cambios en su estado
(update/notify).
SujetoConcreto(ConcreteSubject):
Mantiene el estado de inters para los observadores concretos y los notifica cuando
cambiasuestado.Notienenporqueserelementosdelamismajerarqua.
ObservadorConcreto(ConcreteObserver):
Mantiene una referencia al sujeto concreto e implementa la interfaz de actualizacin,
es decir, guardan la referencia del objeto que observan, as en caso de ser notificados
dealgncambio,puedenpreguntarsobreestecambio.

Overview/Relaciones:
Debilidades:
Con el uso de este patrn ocurre que vamos a desconocer las consecuencias de una
actualizacin, lo cual, dependiendo del problema, puede afectarnos en mayor o menor
medida(porejemplo,alrendimiento).
State
47
Nombre:State
Clasificacin:Estructural
Propsito:Permitirqueunobjetocambiesucomportamientocuandosuestadointerno
cambie.Elobjetoaparentarcambiardeclase.
Tambinconocidocomo:ObjectsforStates
Motivacin:
ConsiderandounaconexinTCP,laclasequelorepresentaTCPConnectionpuedetener
variosestados:conectado,escuchando,cerrado.Cuandodichaclaserecibesolicitudes
externas,deberesponderdiferente,deacuerdoasuestado.Porejemplo,unrequestpara
AbrirConexion,debevariarsilaconexinestcerrada,oenestado:escuchando.Elpatrn
Statedescribecmopuedeconseguirseesto.
Laideaesutilizarunaclaseabstracta,TCPStateenestecaso,querepresentelos
estadosnecesarios.Sedeclaraunainterfazdeestadoqueescomnparatodos,cada
subclaseimplementaelcomportamientoespecficodedichoestado.Laconexin
TCPConnectionmantieneunobjetodeestado(TCPState)querepresentaelestadoactual.
Laconexinentoncesdelegatodaslasresponsabilidadesparticularesdelestadoaeste
objeto.Cuandoelestadocambia,elobjetodeestadotambin.
Aplicabilidad:
Estepatrnsepuedeutilizarenlossiguientescasos:
Cuandoelcomportamientodeunobjetodependedesuestado,ydebecambiarsu
funcionamientoentiempodeejecucin.
Cuandolasoperacionestienencondicionalesmltiplesylargosqueestnasociados
alestadodeunobjeto.
Estructura:
Participantes:
Contexto:
Definelainterfazdeintersparaelcliente
48
Mantieneunainstanciadelestadoconcretoqueseactualizaparadefinirel
estadovigente.
Estado
Defineunainterfazparaencapsularelcomportamientoasociadoaunestado
particulardelcontexto.
EstadoConcreto(subclase)
Cadasubclaseimplementaelcomportamientoalestadodelcontexto.
Colaboracin:
Elcontextodelegaciertasresponsabilidadesasociadasalestadoalobjeto
CurrentStateObject.
Elcontextopuedepasarseasimismoalhacerunallamadaalestado,deesta
manerapermitiendoqueelestadomodifiqueelcontexto.
Contexteselobjetoprincipaldelcliente.LosclientesconfiguranelobjetoContextcon
objetosStateynotienenquelidiarconconfigurarlosobjetosdeestado.
ContextolassubclasesConcreteStatepuedendecidirqueestadosiguedeque
estadoybajoquecircunstancias.
Consecuencias:
Localizaelcomportamientoespecficodelosestadosyparticionaelcomportamiento
paradiferentesestados.
Lastransicionesdeestadosonexplcitas(externas).
LosobjetosdeStatepuedensercompartidos.
Implementacin:
Algunosproblemasdeimplementacinquepuedensurgirsonlossiguientes:
Elpatrnnodefinequinimplementalastransicionesdeestado,sisonfijaslaspuede
implementarelcontexto.Peroalgomsapropiadoseraqueloimplementaranlas
subclasesdefiniendoquinessusucesor.
Otraalternativaparadefinirestructura,esutilizandotablasparamapearlasentradas
haciatransicionesdeestado.
Unpuntoimportanteaconsideraressilosestadossecreancuandoserequiereny
destruyencuandodejandeserutilizados.Osisecreanpermanentementedesdeel
inicio.Ambassolucionestienenventajasydesventajas.
Algunoslenguajesdeprogramacinpermitenutilizarlaherenciadinmica,que
permitecambiarlaestructuraheredadaentiempodeejecucin.
UsosConocidos:
ProtocolosdeConexinTCP
Programasdedibujointeractivo(Laherramientadedibujoenusoeselestado)
49
Patronesrelacionados:Elpatrnflyweightdescribecomopuedencompartirselosobjetos
deestado.UsualmentelosestadosseimplementanutilizandoelpatrnSingleton.
Strategy
Nombre:Strategy
Clasificacin:Comportamiento
Propsito:Defineunafamiliadealgoritmos,encapsulacadauno,yloshace
intercambiables.Estepatrnpermitequeelalgoritmovareindependientementedelos
clientesquelousan.
Tambinconocidocomo:Policy
Motivacin:
Existenmuchosalgoritmospararomperunflujodetextoenlneas.Tenerdichosalgoritmos
dentrodelaclasequelosrequierenoesconvenienteporlosiguiente:
Elclientesevuelvesumamentecomplejosilosincluye.
Diferentesalgoritmossonapropiadosendiferentesmomentos.
Esdifcilvariarlosalgoritmosoagregarnuevossiestnembebidosenelcliente.
Estosproblemassepuedenevitar,silosalgoritmosseencapsulanendiferentesclases.
EstoeselpatrnStrategy.
Aplicabilidad:
UtilizaelpatrndeStrategycuando:
Muchasclasesrelacionadasdifierensoloencomportamiento.Strategyproveeuna
maneradeconfigurarunaclasecondistintoscomportamientos.
Senecesitandiferentesvariantesparaunalgoritmo.
Unalgoritmoutilizadatosqueelclientenodeberaconocer.Estepatrnpermiteevitar
exponerestructurasdedatoscomplejasquesonpartedelalgoritmo.
Unaclasedefinemuchoscomportamientos,yestosaparecencomooperaciones
condicionales.Enlugardemuchoscondicionales,cadaramacondicionalpuedeser
unaclaseStrategy.
Estructura:
50
Participantes:
Stategy:Declaraunainterfazcomnparatodoslosalgoritmos.Elcontextoutiliza
estainterfaceparallamaracualquieralgoritmo.
ConcreteStrategy:ImplementaelalgoritmoutilizandolainterfazStrategy.
Context:MantieneunareferenciaalobjetoStrategy.
Colaboracin:
StrategyyContextinteractanparaimplementarelalgoritmoelegido.
LosclientescreanypasanunobjetoConcreteStrategyalcontexto.Apartirdeeso
nicamenteinteractanconelcontexto.
Consecuencias:
Estepatrntienelassiguientesventajasydesventajas:
Pormediodeherencialosalgoritmospuedenreutilizarfuncionalidadcomn.
Encapsularlasestrategiasesunaalternativaautilizarsubclasesdecontexto.Puer
permitevariarelalgoritmodemaneraindependiente.
Eliminacondicionales
Estepatrnpuedeofreceralternativasdeimplementacincondiferentestradeoffsde
tiempo,recursos,etc.
Unadesventajaesquelosclientesdebenconocerlasdiferenciasentrelas
estrategias,antesdeelegirlamsadecuada.
Puedeexistirunoverheaddeinformacinquesepasadelcontextoalaestrategiay
noesrequeridoniutilizado.
Lasestrategiasincrementanelnmerodeobjetosenlaaplicacin.
Implementacin:
Algunostemasrelevantesdeimplementacinsonlossiguientes:
ElobjetoConcreteStrategydebeteneraccesoeficienteadatosdelcontextoy
viceversa.Algunasopcionesson,pasarlosdatosdelcontextodurantelallamada
pasaralcontextocomounobjeto,locualpuedeteneralgodeoverheadaunque
mantieneseparadosalosobjetos.Lamejortcnicadependerdelaimplementacin.
51
Sepuedenutilizartemplatesparadefinirlasestrategias.Estatcnicaaplicasolosi(1)
laestrategiasepuedeseleccionarentiempodecompilaciny(2)nonecesita
cambiarseentiempodeejecucin.
LaclaseContextopuedesimplificarsesinorequiereforzosamenteunobjetoStrategy.
Elclienterevisasiexiste,cuandonoexisteutilizauncomportamientodefault.Esto
simplificaelcomportamientoyevitalidiarconestrategias,solocuandoesnecesario.
Patronesrelacionados:LosobjetosStrategy,usualmentesonbuenosobjetosFlyweight.
Template Method
Nombre:Template
Contexto: Se puede tener sistemas en los que se pueden identificar objetos que tienen
ciertascaractersticasyfuncionessimilaresenlamayorparte.
Problema: Al crear objetos diferentes por la diferencia mnima de caractersticas y
funcionalidad replica el cdigo y crea una redundancia difcil de mantener. En la programacin
orientadaaobjetosesimportanteevitarlareplicacindecdigo.
Solucin:
Mediante generalizacin: se factoriza el comportamiento comn de varias subclases en una
nica superclase. La forma de manejar esta generalizacin se mejora con un patrn
denominado Template. Dentro del marco de la programacin orientada a objetos este patrn
es un patrn de diseo enmarcado dentro de los llamados patrones de comportamiento, que
se caracteriza por la definicin, dentro de una operacin de una superclase, de los pasos de
un algoritmo, de forma que todos o parte de estos pasos son redefinidos en las subclases
herederasdelacitadasuperclase.
Defineenunaoperacinelesqueletodeunalgoritmo
Delegaalassubclasesalgunosdesuspasos
Redefineciertospasosdelalgoritmosincambiarlaestructuradelalgoritmo

Elementos:
ClaseAbstracta
ClaseNormal
Overview/Relaciones:
52
Ejemplo:
packageCodigo_Template

publicabstractclassMedioTransporte{
//TemplateMethod
publicfinalvoidfuncionar(){
encender()
operarFuncion1()
operarFuncion2()
apagar()
}
publicabstractvoidencender()
publicvoidoperarFuncion1(){
System.out.println("Funcin1")
}
publicabstractvoidoperarFuncion2()
publicabstractvoidapagar()
}

packageCodigo_Template

53
publicclassAvionextendsMedioTransporte{

publicvoidencender(){
System.out.println("EncendidoMotor1")
System.out.println("EncendidoMotor2")
System.out.println("EncendidoMotor3")
System.out.println("EncendidoMotor4")
}

publicvoidapagar(){
System.out.println("ApagadoMotor1")
System.out.println("ApagadoMotor2")
System.out.println("ApagadoMotor3")
System.out.println("ApagadoMotor4")
}

publicvoidoperarFuncion2(){
System.out.println("Funcion2Despegar")
System.out.println("Funcion3Acelerar")
System.out.println("Funcion4Aterrizar")
}
}

packageCodigo_Template

publicclassAutoextendsMedioTransporte{

publicvoidencender(){
System.out.println("EncendidoMotor1")
}

publicvoidapagar(){
System.out.println("ApagadoMotor1")
}

publicvoidoperarFuncion2(){
System.out.println("Funcion2CambiardeVelocidad")
}
}
packageCodigo_Template

publicclassTemplateMethodMedioTransporte{

54
publicstaticvoidmain(String[]args){

MedioTransportetransporte=newAuto()
transporte.funcionar()

System.out.println()

MedioTransportetransporte2=newAvion()
transporte2.funcionar()

}
}
Visitor
Nombre:Visitor
Clasificacin:Comportamiento
Propsito:Pararepresentarunaoperacinqueserejecutadaporloselementosdeun
objeto.Estepatrnpermitedefinirunanuevaoperacinsincambiarlasclasesdelos
elementossobrelosqueopera.
Tambinconocidocomo:
Motivacin:Sisetieneelcomportamientodeunobjetohardcoded,comoporejemploun
rboldeanlisissintcticoyserequieresobrescribirlasclasesdecadanodosepuede
utilizarelpatrnVisitorparacambiarelcomportamiento.
Aplicabilidad:
Cuandolaestructuradelobjetocontienemuchasclasesylasoperacionesquese
ejecutandependendelasclases.
Setienenmuchasoperacionesdistintasysinrelacin.ConelpatrnVisitorsepuede
crearunaclaseVisitorparacadatipodeoperacinysepararlaimplementacindela
operacindelaestructuradelobjeto.
Estructura:
55
Participantes:
Visitor.DeclaramtodosvisitabstractosparacadaConcreteElement.
ConcreteVisitor.Implementalosmtodosvisit.
AbstractElement.Defineunmtodoacceptabstractoquerecibecomoparmetroun
Visitor.
ConcreteElement.Implementaelmtodoacceptquerecibecomoparmetroun
Visitor.
ObjectStructure.EnumeraloselementosenunacoleccinoComposite.
Colaboracin:
UnclientecreaunConcreteVisitoryrecorrelaestructuradelobjetoalllamarel
mtodoacceptenlaraizdelobjeto.
CuandounobjetoConcreteElementesvisitado,invocaelmtodovisitenelobjeto
ConcreteVisitorquefuepasadocomoparmetro.
EnlasiguientefigurasemuestralainteraccinentreunobjetoConcreteVisitor,un
ObjectStructureydosobjetosConcreteElements.
56
Consecuencias:
Esfacilaadiroperacionesenlaestructuradelobjetoalagregarnuevasclasesdel
tipoConcreteVisitor.
EsdifcilagregarclasesConcreteElement,yaquecadanuevaclasellevaaunnuevo
mtodovisitabstracto.
ElvisitorpuedellamarelmtodoacceptenunConcreteElementaunquenotengan
unaclasebasecomun.
Elvisitorpuedeacumularunestado.
Implementacin:
CadaobjetotendrasociadaunaclaseVisitor.Estaclasedefineparacada
ConcreteElementelcorrespondientemtodovisit.
Sepuedeutilizaroverloadingodefinirlosmtodoscondistintosnombres.
Pararecorrerlaestructuradelobjetosepuedehacerenelobjeto,enelvisitoroenun
iterator.
Patronesrelacionados:
Composite.Losvisitorspuedenserusadospararecorrerlacomposicindelpatron
Composite.
Interpreter.Losvisitorspuedenserutilizadospararealizarlainterpretacin.
57
Bibliografa
Dubuis,E.Interpreter.SoftwareEngineering2:SlidesandotherCourseMaterial.
https://prof.hti.bfh.ch/due1/courses/c355/slides/patterns/interpreter.pdf
Dubuis,E.Visitor.SoftwareEngineering2:SlidesandotherCourseMaterial.
https://prof.hti.bfh.ch/due1/courses/c355/slides/patterns/visitor.pdf
Gamma,E.,Helm,R.,Johnson,R.,Vlissides,J.(2009).DesignPatterns:Elementsof
ReusableObjectOrientedSoftware.AddisonWesley.
Freeman,E.&Robson,E.&Bates,B.&SierraK.(2004).HeadFirstDesignPatterns.
O'ReillyMedia.
58

Das könnte Ihnen auch gefallen