Boletn de ejercicios. (Junio 2007) . !ean las si"uientes dos clases Java abstract class B { abstract public void metodo1 (); } abstract class A { public void necesitoUnB() { B ob = ??? //crear un B ob.metodo1(); } } #a clase A tiene el m$todo necesitoUnB() %ue de&e crear un o&jeto de al"una su&clase de B ' asi"narlo a la varia&le ob( )ero A no de&e contener referencias e*)lcitas a las su&clases de B. +om)leta el c,di"o de este m$todo a)licando al"uno de los )atrones vistos en clase ' e*)lica c,mo se consi"ue crear la instancia de la su&clase. -rimero de&es indicar una soluci,n sin metaclases ' lue"o otra con metaclases. Solucin 1. .)licaramos el )atr,n Mtodo Factora sin metaclases class B1 extends B { public void metodo1 (); } abstract class A { abstract public B crearUnB(); public void necesitoUnB() { B ob = crearUnB() //crear un B ob.metodo1(); } } class A1 extends A { public B crearUnB() { return ne B1(); } } Solucin 2. .)licaramos el )atr,n Mtodo Factora con una clase Factora. class B1 extends B { public void metodo1 (); } abstract class A { abstract public B crearUnB(); public void necesitoUnB() { B ob = !actoria."et#nstancia().crearUnB() ob.metodo1(); } } class !actor$a { // ser$a un %in"leton public B crearUnB(%trin" nombre) { return (B)&lass.'or(ame(nombre).ne#nstance() } } 2. !u)uesto %ue se est$ desarrollando un jue"o interactivo %ue )ermite al usuario interactuar con )ersonajes %ue jue"an ciertos roles. !e desea incor)orar al jue"o una facilidad )ara crear nuevos )ersonajes %ue se a/aden al conjunto de )ersonajes )redefinidos. 0n el jue"o( todos los )ersonajes sern instancias de un )e%ue/o conjunto de clases tales como )eroe( *illano( +rincipe o ,onstruo. +ada clase tiene una serie de atri&utos como nombre( ima"en( altura( peso( inteli"encia( -abilidades( etc. ' se"1n sus valores( una instancia de la clase re)resenta a un )ersonaje u otro( )or ejem)lo )odemos tener los )ersonajes )rnci)e &o&o o un )rnci)e listo( o monstruo &ueno o monstruo malo. 2ise/a una soluci,n &asada en )atrones %ue )ermita al usuario crear nuevos )ersonajes ' seleccionar )ara cada sesi,n del jue"o )ersonajes de una colecci,n de )ersonajes creados. 0scri&e el c,di"o de los m$todos del catlo"o de )ersonajes %ue )ermiten a/adir un nuevo )ersonaje a la colecci,n ' seleccionar un )ersonaje )ara ju"ar. Solucin !e utili3a el )atr,n -rotot')e )ara mantener un catlo"o de instancias )rotot)icas %ue se crean a )artir de los )ersonajes )redefinidos. 0l catlo"o )uede im)lementarse como un sin"leton. Heroe clone() Villano clone() Principe clone() Personaje clone() Juego Catalogo Personajes addPersonaje() getPersonaje() class &atalo"o+ersona.es { public static &atalo"o+ersona.es "et#nstancia() { i' (unica#nstancia == null) unica#nstancia = ne &atalo"o+ersona.es(); return unica#nstancia; } private static &atalo"o+ersona.es unica#nstancia = null; private &atalo"o+ersona.es() {persona.es= ne )as-/able();} private )as-/able persona.es; public void add+ersona.e(%trin" nom0 +ersona.e p) { persona.es.put(nom0 p); } public +ersona.e "et+ersona.e(%trin" nombre) { +ersona.e p = (+ersona.e) persona.es."et(nombre); return (+ersona.e) p.clone(); } } 4. #a li&rera !5in" de Java inclu'e la clase 12ist )ara )resentar una lista de o&jetos (el te*to %ue se visuali3a es determinado )or el m$todo to%trin" de la clase de los o&jetos) ' )ermitir al usuario seleccionar uno de ellos. 0l dise/o de esta clase es un ejem)lo de utili3aci,n del )atr,n Adaptador )ara conse"uir una clase reutili3a&le6 se consi"ue %ue 12ist sea inde)endiente de la fuente (o modelo) de datos. Muestra mediante un dia"rama de clases el dise/o %ue )ermitira a una clase como 12ist visuali3ar diferentes listas de items( como )or ejem)lo un catlo"o de clientes ()or ejem)lo( se mostrara su 7IF) o un catlo"o de cuentas ()or ejem)lo( se mostrara el c,di"o de cuenta). -ara cada clase o interfa3 del dia"rama indica los m$todos ' atri&utos %ue son si"nificativos. 7,tese %ue la clase 12ist necesita dis)oner de informaci,n como el n1mero de tems a visuali3ar ' el o&jeto seleccionado. #os ada)tadores almacenan la lista %ue se visuali3a como una instancia de *ector. Solucin. ListModel getTamao() getElemento() JList mostrar() setSelectedItem() daptadorCuentas CatalogoCuentas daptadorClientes CatalogoClientes !model 8. !ea un conjunto de clases %ue )ermiten la creaci,n ' envo de mensajes de correo electr,nico ' %ue entre otras inclu'e clases %ue re)resentan el cuer)o del mensaje( los ane*os( la ca&ecera( el mensaje( la firma di"ital ' una clase encar"ada de enviar el mensaje. 0l c,di"o cliente de&e interactuar con instancias de todas estas clases )ara el manejo de los mensajes( )or lo %ue de&e conocer en %u$ orden se crean esas instancias6 c,mo cola&oran esas instancias )ara o&tener la funcionalidad deseada ' cules son las relaciones entre las clases. Idea una soluci,n &asada en al"1n )atr,n tal %ue se redu3can las de)endencias del c,di"o cliente con esas clases ' se redu3ca la com)lejidad de dic9o c,di"o cliente )ara crear ' enviar mensajes. 2i&uja el dia"rama de clases %ue refleje la soluci,n e indica %u$ )atr,n 9as utili3ado. Solucin. :a&ra %ue utili3ar el )atr,n Fachada. !e crea una clase !ac-ada3mail %ue )ro)orciona la interfa3 necesaria )ara acceder al su&sistema formado )or clases como )eader( ,essa"e( 4i"ital%i"nature( %end,essa"e( etc. ;. 0*)lica c,mo se utili3a el )atr,n Proxy )ara im)lementar una materiali3aci,n )ere3osa de instancias almacenadas en una &ase de datos. Solucin. (<er fotoco)ia entre"ada en clase con dia"rama de clases %ue mostra&a un =)ro*' virtual Fa&ricante>( e*trada del li&ro de #arman( )"ina ;22) +uando se car"a un o&jeto desde la &ase de datos( )or ejem)lo una instancia de +roducto( no se car"an todos sus cam)os( sino %ue )ara al"1n cam)o( normalmente )or ra3ones de rendimiento( se difiere la car"a 9asta %ue es necesario en el momento %ue se referencia( )ara lo cual se a)lica el )atr,n Proxy. I"a#ricante $$Inter%ace&& get'ireccion() Producto %a#ricante ( I"a#ricante Pro)* "a#ricante sujeto+eal ( I"a#ricante get'ireccion() getSujeto+eal() "a#ricante get'ireccion() ?. !u)uesto %ue se est constru'endo una li&rera de clases )ara re)resentar com)onentes @UI( se 9a decidido %ue en ve3 de %ue un )ro"ramador defina la )osici,n de los com)onentes @UI (Button( List( Dialog(..) so&re una ventana( se inclu'an manejadores de dis)osici,n de com)onentes (layout manager)( cada uno de los cuales distri&u'e un conjunto dado de com)onentes "rficos de acuerdo a al"1n es%uema de distri&uci,nA 9ori3ontalmente( verticalmente( en varias filas( en forma de una matri3( etc$tera. 2e&e ser )osi&le cam&iar en tiem)o de ejecuci,n la distri&uci,n ele"ida inicialmente. !u)uesto %ue la clase 1+anel es la %ue re)resenta a un contenedor de com)onentes "rficos( dise/a una soluci,n )ara introducir en la li&rera los manejadores de dis)osici,n. 2i&uja el dia"rama de clases %ue refleje la soluci,n e indica %u$ )atr,n 9as utili3ado. Solucin. !e utili3ara el )atr,n Estrategia La*outVe rtical distri#uir() La*outHori ,ontal distri#uir() JPanel mostrar() ILa*out distri#uir() !tipoLa*out 7. !e desea escri&ir una clase Util/ime( %ue no es a&stracta( %ue inclu'a un m$todo esttico time %ue mide el tiem)o %ue tarda un m$todo cual%uiera en ejecutarse. -arte del c,di"o de dic9o m$todo seraA public static lon" time ( 5par6metros7) { lon" t1 = %8stem.current/ime,illis(); // 'alta a9u$ el c:di"o apropiado lon" t; = %8stem.current/ime,illis(); return t; < t1 } 2ise/a una soluci,n &asada en al"uno de los )atrones de dise/o ' com)leta el m$todoA )armetros ' c,di"o en la )osici,n del comentario. 0scri&e un c,di"o cliente con un ejem)lo de utili3aci,n del m$todo time(). !oluci,n. Utili3ar el )atr,n Command %ue enca)sula un mensaje -tilTime time() .rden ejecutar() $$Inter%ace&& ./ ejecutar() 0oid ejecutar() 1 o#j2metodo() 3 public static lon" time ( =rden o) { lon" t1 = %8stem.current/ime,illis(); o.e.ecutar() lon" t; = %8stem.current/ime,illis(); return t; < t1 } +,di"o clienteA Util.time (ne =1() ) B. !ea una clase /ext*ie %ue re)resenta un com)onente @UI ventana de te*to %ue es su&clase de una clase &omponent ra3 de la jerar%ua de clases %ue re)resentan com)onentes @UI. Cueremos definir ventanas de te*to con diferentes ti)os de &ordes (Plain( 3D( Fancy) ' &arras de des)la3amiento (9ori3ontal( vertical). #a clase /ext*ie tiene un m$todo di&ujar entre otros class /ext*ie { public void mostrar() { // c:di"o para dibu.ar el ob.eto /ext*ie } } Utili3a este ejem)lo )araA a) Mostrar el dia"rama de clases %ue resulta de a)licar el )atr,n Decorador. &) 0scri&ir el c,di"o de una clase decoradoraA atri&utos( constructor ' m$todo mostrar( ' se/alar %u$ cam&ios es )reciso reali3ar so&re la clase /ext*ie al a)licar el )atr,n Decorador. c) 2escri&ir c,mo el )atr,n Strategy es una alternativa al )atr,n Decorador( mostrando el dia"rama de clases ' se/alando los cam&ios %ue reali3aras so&re el c,di"o dado de la clase /ext*ie. d) 0scri&ir un c,di"o cliente Java %ue crea un o&jeto /ext*ie con un &orde 42 ' una &arra de des)la3amiento 9ori3ontal( )ara el caso %ue se usan decoradores ' )ara el caso %ue se usan estrate"ias. a) Te)tVie4 di#ujar() 5order Scroll 6'5order Plain HorScroll VertScroll 'ecorador di#ujar() Component di#ujar() !comp &) abstract class 4ecorator extends &omponent { &omponent comp; public 4ecorator(&omponent c) { comp = c;} public dibu.ar() {comp.dibu.ar();} } class +lain extends Border { //atributos 8 m>todos adicionales public void dibu.ar() { super.dibu.ar(); dibu.arBorde+lain();} ... } ./adir decoradores no re%uiere modificar la jerar%ua de com)onentes visuales c) +onviene usar el )atr,n Estrategia en ve3 de Decorador si la clase &omponent est mu' =car"ada>. Te)tVie4 di#ujar() 5order Scroll 6'5order Plain HorScroll VertScroll Component di#ujar() Estrategias 'ecorador di#ujar() !est !ne)t 0l m$todo di&ujar de /ext*ie de&e incluir la invocaci,n est.dibu.ar() )ara o&tener la funcionalidad a/adida )or los decoradores. .9ora los o&jetos decorados (/ext*ie) tienen una referencia a los =decoradores>( al rev$s de lo %ue sucede cuando usamos el )atr,n Decorador. d) +on 2ecoradorA &omponent c = ne ?4Border (ne *ert%croll (ne /ext*ie)) +on 0strate"iaA /ext*ie tv = ne /ext*ie (); tv.set3strate"ia(ne *ert%croll(ne ?4Border())) o si un +om)onent contiene las estrate"ias como una a"re"aci,nA /ext*ie tv = ne /ext*ie (); tv.add3strate"ia(ne *ert%croll()); tv.add3strate"ia(ne ?4Border()); D. !u)uesto %ue estamos desarrollando una a)licaci,n financiera( se 9a decidido em)lear el )atr,n Composite( )uesto %ue e*isten diferentes valores elementales (acciones( &onos( futuros( fondos(..) ' valores com)uestos (carteras de valores( cuentas(..). 2escri&e c,mo utili3ar el )atr,n isitor )ara reali3ar diferentes o)eraciones so&re un valor com)uesto( tales como calcular su )recio u o&tener informaci,n fiscal anual ECu$ &eneficios se o&tienen al a)licar el )atr,n isitorF #a estructura de datos es definida )or el )atr,n Composite ' se define una jerar%ua de !isitors )ara a)licar o)eraciones so&re ella. ccion accept() "uturo accept() 5ono accept() ValorFinaciero 0alor() accept(VisitorValores) Cartera accept() VisitorValores getPrecio() 0isitar(5ono) 0isitar(ccion) 0isitar("uturo) 0istar(Cartera) VisitorPrecio VisitorIn%ormacion 0oid accept( VisitorValores 0) 1 020isitar5ono(t7is) 3