Está en la página 1de 8

Facultad de Informtica Universidad de Murcia

Anlisis y Diseo del Software


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

También podría gustarte