Está en la página 1de 56

Asociación de

Clases en Java
v1.0
Febrero 2012
Ferreiras.

Ferreiras Asociaciones de clases 1


Relaciones entre clases
Representan los diferentes tipos de
conexiones entre las clases. Pueden ser:
 Asociación; Asociación: Es el tema
 Composición; a tratar en lo inmediato.
Las otras relaciones las
 Agregación; veremos mas adelante.
 Dependencia;
 Herencia;
 friend - C++ -;
Ferreiras Asociaciones de clases 2
Asociación
Es una relación usada para conectar dos
clases. Una línea sólida conecta a las
clases asociadas. Una asociación describe
una relación que existirá entre las
instancias de las clases en tiempo de
ejecución. Por ejemplo:
A B

Ferreiras Asociaciones de clases 3


 Una asociación es una simple
conexión estructural o canal entre
las clases y es una relación donde
todos los objetos (instancias de
dichas clases) tienen su propio ciclo
de vida y no hay dueño.

Ferreiras Asociaciones de clases 4


Asociación
 Existe una asociación entre dos clases si
una instancia de una clase debe saber
sobre la instancia de la otra clase con el
fin de realizar su trabajo. Esto es, en una
asociación, una instancia de una clase usa
una instancia de la otra clase para llevar a
cabo una tarea. Por esta razón una
asociación es llamada una “relación de uso.”

Ferreiras Asociaciones de clases 5


Asociación
 Si en la declaración del problema
encontramos términos como “usar a”,
“enviar a”, “obtener de”, “depender de”,
“solicitar a”, “pedir a”, “requerir de”, o
“informar a” o “comunicar a” estos son
indicios, pistas que probablemente
indiquen asociaciones de clases.

Ferreiras Asociaciones de clases 6


Asociación
 Las clases que colaboran
usualmente se relacionan a través de
asociaciones. Es por ello que las CRC ( a
ver en este curso ) son una fuente,
también, para identificar asociaciones de
clases.

Ferreiras Asociaciones de clases 7


Asociación
 Asociaciones binarias Son
asociaciones que relacionan dos clases.
Pueden participar tres, cuatro o incluso
mas clases en las asociaciones. No
obstante, las asociaciones binarias son la
mas fácil de conceptualizar y, por ello,
tienden a ser las mas comunes.

Ferreiras Asociaciones de clases 8


Elementos en un asociación
 Una asociación representa algún
tipo de relación entre los objetos de
las clases conectadas. Luego, los
siguientes elementos son
necesarios, y recomendable, usarlos
en una asociación, para un mejor
esclarecimiento de la asociación:
nombre de la asociación y nombre del
rol y multiplicidad de los extremos.

Ferreiras Asociaciones de clases 9


Elementos en un asociación

 Nombre1 de la asociación, con un símbolo,


opcional, que indique el sentido en el cual se
debe leer. Por ejemplo:
Persona Trabajar-para 
Empresa

Es el nombre de la
asociación.

1
: Si no esta nombrada, por defecto
Ferreiras
el nombre es “tiene”.
Asociaciones de clases 10
Elementos en un asociación
 Continuando con el ejemplo anterior:
Persona Empresa
Trabajar-para 

Claramente, esta asociación representa el hecho


de que “Personas trabajan para empresas”
empresas

Y, nunca podrá entenderse como “Empresas


trabajan para personas”,
personas porque así lo establece el
símbolo  para su lectura.

Ferreiras Asociaciones de clases 11


Elementos en un asociación

 El nombre de una asociación es


elegido de modo que, en combinación con
los nombres de las clases relacionadas,
se pueda producir una sentencia sensata
que describa la relación entre dichas
clases conectadas, como, por ejemplo,
ejemplo
en la asociación Trabajar-para podemos
producir:
“Personas trabajan para empresas”
empresas
Ferreiras Asociaciones de clases 12
Elementos en un asociación

 Una frase verbal  En caso de


utilizarse, el nombre de la asociación
debe reflejar el propósito de la
relación, para ello es recomendable
usar una frase verbal ( construcción
formada por un verbo ).

Ferreiras Asociaciones de clases 13


Elementos en un asociación

 Nombre del rol o Papel que


desempeña un extremo  Cada extremo
de la asociación pueden ser etiquetado con
un nombre del rol o papel que desempeña
en ésta, el cual aclara la naturaleza de
dicha asociación.

Ferreiras Asociaciones de clases 14


Elementos en un asociación

 Nombre del rol o Papel que


desempeña un extremo  Además
de su nombre, la mayor parte de la
información acerca de una asociación
se define en sus extremos, su
confluencia con una clase.

Ferreiras Asociaciones de clases 15


Elementos en un asociación

 Un nombre de un rol Se elige para


describir cómo se ven los objetos de una
clase en un extremo de una asociación
desde la perspectiva de los objetos de la
clase del otro extremo.

Ferreiras Asociaciones de clases 16


Elementos en un asociación
Por ejemplo, en la asociación Trabajar-Para:
rol

empleado empleador
Persona Empresa
Trabajar-para 

Rol: Cada objeto Persona


Nombre de la Rol: Cada objeto Empresa
ve a un objeto Empresa
asociación ve a un objeto Persona
como su “empleador”.
como su “empleado”.
Luego, “empleador” seria
Luego, “empleado” seria
un nombre apropiado para
un nombre apropiado para
el rol de cada objeto de la
el rol de cada objeto de la
clase Empresa
clase Persona

Ferreiras Asociaciones de clases 17


 Mas ejemplos de nombres de roles

Note: One Personal Computer sees the System Unit (the CPU) as your computer brain.

Recuperated from
http://www.ts.mah.se/RUP/RationalUnifiedProcess/process/modguide/md_assoc.htm
Ferreiras Asociaciones de clases 18
Elementos en un asociación

 El nombre del rol  Tendrá un papel


importante cuando sea implementada la
asociación. Es conveniente que el nombre
del rol sea el de una variable puntero (C+
+), o referencia ( Java ) del tipo de la clase
en el extremo donde ésta esté. (Ver mas
adelante en Codificación de una
Asociación )

Ferreiras Asociaciones de clases 19


Multiplicidad
La multiplicidad de una asociación define el
número de instancias de una clase en un
extremo de dicha asociación que puede o
debe tener conexión con una instancia de la
clase en el otro extremo. Luego, esta
multiplicidad puede ser:
 Uno-A-Uno
 Uno-A-Mucho
 Mucho-A-Uno
 Mucho-A-Mucho
Ferreiras Asociaciones de clases 20
Multiplicidad
Para expresar de manera más clara la
multiplicidad de una asociación se pueden
usar, solos o combinados, el cero,
números naturales y el símbolo de la
cerradura de Kleene (  ).

Ferreiras Asociaciones de clases 21


 Las expresiones más comunes son:

Multiplicidad Significado
0..1 Cero ó Uno
1 Uno sólo, exactamente uno, uno
0.. ó  Cero ó más, mucho
1.. Uno ó más, al menos uno
n Únicamente n ( Donde n > 1 )
0..n Cero a n ( Donde n > 1 )
1..n Uno a n ( Donde n > 1 )
n..m n a m ( Donde n & m > 1 )
n..m ó z Un numero exacto; p.e.: 3..4 ó 6
Compleja Por ejemplo: 0..1, 3..4, 6.. significa cualquier
número de objetos que no sean 2 ó 5.

Ferreiras Asociaciones de clases 22


Multiplicidad
Por ejemplo, en la asociación Trabajar-Para:
empleado empleador
Persona Empresa
 Trabajar-para  1

 Es la multiplicad de 1 Es la multiplicidad de
este extremo e indica este extremo e indica
que “ Cero o mas que “ Un objeto
objetos Persona Empresa exactamente
Empresa,
pueden estar uno, debe estar
conectados con un conectado con un
objeto Empresa “ objeto Persona”
Persona

Ferreiras Asociaciones de clases 23


Multiplicidad
 ¿ Cómo leer las anotaciones de
multiplicidad ?  Para dar una descripción
más completa de la relación que está siendo
representada por la asociación, las anotaciones
de multiplicidad se pueden leer:
 En conjunto con los nombres de los roles
de los extremos; O,

 Con los nombres de las clases asociadas.

Ferreiras Asociaciones de clases 24


Multiplicidad
Por ejemplo, la asociación Trabajar-para
empleado empleador
Persona Empresa
 Trabajar-para  1

Puede ser leída como :


Un empleado debe trabajar para un empleador; O,

Una Persona debe trabajar para una Empresa

Ferreiras Asociaciones de clases 25


Multiplicidad
 El significado preciso de las anotaciones
de multiplicidad tiene que ver con el número
de conexiones que pueden existir en un
momento dado, en tiempo de ejecución.
ejecución

 Por ejemplo, considerando la asociación


TrabajaPara que hemos estado usando,
podemos decir que:

Ferreiras Asociaciones de clases 26


Trabajar-para
SIN : Empresa
Alicia : Persona Trabajar-para

CNN : Empresa
Balbuena : Persona

 Son ilegales porque:


a) El objeto Persona Alicia trabaja simultáneamente para
dos objetos Empresas;
b) El objeto Persona Balbuena no esta conectado a
ningún objeto Empresa.

Trabajar-para  Es una instancia de la asociación Trabajar-para

Ferreiras Asociaciones de clases 27


Multiplicidad
En general, la información de multiplicidad
debe ser mostrada en las asociaciones, pero
los nombres de la asociación y los
nombres de los roles de los extremos son
opcionales.
opcionales Se debe elegir un nivel de
detalle necesario para hacer una
representación de fácil comprensión.

Ferreiras Asociaciones de clases 28


Multiplicidad
 Si hay mas de una asociación entre el
mismo par de clases, es necesario algún
etiquetado textual para clarificar las
asociaciones y asegurar que la multiplicidad
correcta es entendida para cada asociación.
Por ejemplo:

Ferreiras Asociaciones de clases 29


 Por ejemplo: Considerando el caso de
que una persona pueda ser empleado y a
la vez cliente de una empresa.
empleado empleador
 1
Persona Empresa
cliente proveedor
 
Un empleado debe tener un empleador
Un empleador puede tener cero o mas empleados

Una Persona debe tener una Empresa

Una Empresa puede tener cero o mas Persona


Ferreiras Asociaciones de clases 30
Multiplicidad
 En una asociación reflexiva, Esto es, una
asociación en la cual ambos extremos
conectan a la misma clase, los nombres de
los roles de los extremos son muy útiles para
distinguirlos entre si y esclarecer lo
representado por la asociación. Por ejemplo:

Ferreiras Asociaciones de clases 31


hijo
Persona

DescenderDe 
1..

Procrear 
padre 2

Un hijo debe descender de dos padre

Un padre debe procrear uno o mas hijo

Ferreiras Asociaciones de clases 32


 Otro ejemplo:

supervisor
Empleado
1

Supervisa a 
obrero
2..10

Un supervisor debe supervisar 2 a 10 obreros

OJO: De obrero a supervisor no hay interés


Ferreiras Asociaciones de clases 33
Navegabilidad
Muestra la dirección en la cual una
asociación puede ser recorrida o consultada,
mediante una punta de flecha en la línea de la
asociación. Por ejemplo:
0..* 1..*
Cliente Dirección

Un cliente puede ser consultado acerca de su


dirección; pero una dirección no puede ser
consultad por su cliente.

Ferreiras Asociaciones de clases 34


 En otras palabras, En la asociación
Cliente – Dirección anterior, Un objeto
Cliente debe conocer sus objetos
Dirección con los que está asociados,
pero un objeto Dirección no tiene
conocimiento de los objetos Cliente con
los que está asociados.

Ferreiras Asociaciones de clases 35


 Otro ejemplo de navegabilidad
Persona Carro

Posee 

 Una Persona puede poseer 0 ó más Carro;


No hay forma, en la representación actual, de
consultar desde Carro a Persona

 El símbolo  ...

Ferreiras Asociaciones de clases 36


 Otro ejemplo de navegabilidad

Pedido Mercancía

cantidad 0..* 1..* peso


aplicaITBIS precio
calcularSubtoal getPrecio
calcularPesoTotal getPeso

 Un objeto Pedido puede ser consultado


acerca de sus objetos Mercancia, pero no a la
inversa, esto es, un objeto Mercancía no puede
ser consultado acerca de sus objetos Pedido.

Ferreiras Asociaciones de clases 37


 La navegabilidad se utiliza para
registrar el hecho de que ciertos
conexiones de clases en el sistema sólo se
podrían recorrer, o los mensajes enviados,
en una dirección. La navegabilidad es
indicada por medio de una flecha abierta,
que se coloca en el extremo de la línea de
asociación junto a la clase de destino.

Ferreiras Asociaciones de clases 38


Asociación unidireccional,
asociación bidireccional
 Asociación unidireccional Es aquella
asociación cuya navegabilidad es en un solo
sentido. Esto significa que la clase de origen tiene
una referencia a la clase destino, pero la clase
destino no sabe acerca de la clase de origen.
Esto último es importante a tener en cuenta para
fines de implementación. Los ejemplos
anteriores son asociaciones unidireccionales.

Ferreiras Asociaciones de clases 39


Asociación unidireccional,
asociación bidireccional
 Asociación bidireccional Es aquella
asociación cuya navegabilidad es en ambos
sentidos.
sentidos Esto significa que ambas clases tienen
referencias entre sí. En otras palabras, ambas
clases en los extremos de la asociación son, al
mismo tiempo, origen y destino. Ambas se
pueden consultar entre sí. Por defecto, si no se
indica la navegabilidad, la asociación es
bidireccional.

Ferreiras Asociaciones de clases 40


propietario
 Por ejemplo:

1..1 0..*
Persona Perro
propietario mascota

Representa los mismo que:


1..1 0..*
Persona Perro
propietario mascota
 Un objeto Persona puede consultar cuantos objetos Perro tiene.
 Un objeto Perro puede consultar cuál es su único objeto Persona.
 En la implementación, la clase Persona y la clase Perro tendrán
referencias entre sí ( un contenedor de mascota en Persona y una variable
propietario en Perro ).
 Normalmente se implementan dividiéndolas en dos asociaciones
unidireccionales y una tercera clase que las conecta.

Ferreiras Asociaciones de clases 41


Implementación de asociaciones
[ Codificando asociaciones ]
Implementar una asociación es codificar en
un lenguaje de programación la situación
representada. Normalmente, esto es hecho
usando variables punteros ( C++ ) o
referencias (Java), inicializándolas en el
constructor.

Ferreiras Asociaciones de clases 42


 En términos de Java La variable
referencia es declarada con el tipo de la
clase en el otro extremo de la asociación y
es inicializada en el constructor de la
primera clase. Por ejemplo:
usa
A B  Se implementaría como:
1 0..1
Obsérvese: El nombre
class A { del rol en el extremo de
private: B es usado como
class B { B usa; nombre de la variable
//...miembros // ... referencia en A.
}; public:
A( B refb ){ usa = refb;}
// ...
};

Ferreiras Asociaciones de clases 43


association2d.java
jdk1.7.0

Ferreiras / Java / Associacion de clases

Implementar la asociacion de clases indicada:

+--------+ miAula usuariosAula +---------------+


| Aula |------------------------------------------->| Profesores |
+--------+ 1..1 imparten-clase-> 0..* +--------------+

Esta asociación representa una situación de la vida real en la cual varios


profesores están relacionados con una Aula, porque imparten clase allí:

En un Aula pueden <impartir clase> cero o mas Profesor


Un Profesor debe <impartir clase> en una y sólo una Aula !!

Según la navegabilidad representada, sólo los objetos Aula “conocen” de la


existencia de los objetos Profesor.

Ferreiras Asociaciones de clases 44


Esta navegabilidad ( De Aula a Profesores ) indica que la implementacion
soportara una consulta rapida y facil desde un objeto Aula a los objetos
Profesor propietarios. Esto es, si conocemos un aula, podremos
encontrar sus profesores. No obstante, no hay garantia de lo inverso.
Esto es, si conocemos el profesor encontrar el aula.

Esta navegabilidad es construida en cada uno de los objetos Aula


refiriendo a un contenedor de objetos Profesor. Para ello usaremos un
Vector de objetos Profesor que llamaremos usuariosAula. Con la
declararion dentro de la clase Aula, de la variable usuariosAula:

Vector<Profesor> usuariosAula;

Ferreiras Asociaciones de clases 45


import java.util.*;

/////////////////////////////////

class Profesor {
private int codigo;
public Profesor( int co ) {
codigo = co;
}

int getCodigo() {
return codigo;
}
}

Ferreiras Asociaciones de clases 46


class Aula {

private int numero; // Numero de aula


private Vector<Profesor> usuariosAula; // Profesores que usan esta aula

public Aula( int nu, Vector<Profesor> profesores ) {


numero = nu;
usuariosAula = profesores;
}

public int getNumero() {


return numero;
}

public Vector<Profesor> getUsuariosAula() {


return usuariosAula;
}

Ferreiras Asociaciones de clases 47


class usoClases {

public boolean buscarProfesor( Aula au, int codProf ) {


boolean retorno = false;
Vector<Profesor > v;
v = au.getUsuariosAula() ;

Iterator<Profesor> iter = v.iterator();

// Recorrer el Vector buscando el codigo del profesor

while( iter.hasNext( ) ) {
Profesor unProfe = iter.next();
if ( unProfe.getCodigo() == codProf )
retorno = true;

}
return retorno;
}

Ferreiras Asociaciones de clases 48


public void fofi() {
// Profesores a ser asignados a las Aulas
Vector<Profesor> vp = new Vector<Profesor> ();
vp.add( new Profesor(1234) );
vp.add( new Profesor(5647) );
vp.add( new Profesor(8912) );
vp.add( new Profesor(6734) );
vp.add( new Profesor(5567) );
vp.add( new Profesor(1734) );
vp.add( new Profesor(2136) );
System.out.println( "\n* Cantidad de profesores para asignar: " +
vp.size() + "\n");

Ferreiras Asociaciones de clases 49


// Creamos un Aula y le mandamos su asignacion

Aula AB101 = new Aula( 101, vp );

// Vemos todos los profesores asignados a un Aula


int codigo; // Del profesor a buscar
System.out.print( "\n* En el aula AB-" + AB101.getNumero() + " hay " +
AB101.getUsuariosAula().size() + " profesores " +
"\n\n* * Entre el codigo del profesor a buscar: " );
Scanner lector = new Scanner(System.in);
int cod = lector.nextInt();
boolean x = buscarProfesor( AB101, cod ) ;
if( x )
System.out.println( "\n\n* Encontrado !! \n" );
else
System.out.println("\n\n* No encontrado !!\n");
}

Ferreiras Asociaciones de clases 50


C:\Archivos de programa\Java\jdk1.7.0\bin> java Association2d

* Cantidad de profesores para asignar: 7

* En el aula AB-101 hay 7 profesores

* * Entre el codigo del profesor a buscar: 4567

* No encontrado !!

C:\Archivos de programa\Java\jdk1.7.0\bin>java Association2d

* Cantidad de profesores para asignar: 7

* En el aula AB-101 hay 7 profesores

* * Entre el codigo del profesor a buscar: 1234

* Encontrado !!

C:\Archivos de programa\Java\jdk1.7.0\bin>

Ferreiras Asociaciones de clases 51


 Asignación para ser entregada
cuando sea requerida formalmente en el
grupo:
Ahora es su turno Joven: Considere la situación de la vida real
universitaria que usted conoce, esto es, varios profesores imparten
clase en una misma aula, obviamente que a diferentes horarios cada
uno, es decir, no se juntan dos profesores en una misma aula en un
mismo horario, y un profesor puede impartir clase en varias aulas
pero, si imparte clase, debe ser en un aula, sin que tenga “choque”
de aulas. Un profesor querrá saber las aulas que tiene asignadas y
un aula querrá saber los profesor que tiene asignados.

Su trabajo: Hacer la representación y la


implementación en código Java
Ferreiras Asociaciones de clases 52
 A partir de la siguiente información
acerca del juego de críquet:

 Un equipo de críquet tiene 11 jugadores. Uno de ellos es


el capitán;

 Un jugador sólo puede jugar para un equipo;

 El capitán lidera a los miembros del equipo;

Construir la asociación correspondiente.

Ferreiras Asociaciones de clases 53


 Solución del problema anterior

1 0..1
jugadores capitán
Jugador Equipo
10
11 miembro-de  1
1 capitán

 liderea

 Su tarea1: Implementar esta asociación


1: Para su entrega, esperar el requerimiento formar en el grupo.
Esto significa, que usted debe hacerla ya y guardarla a la espera
de que sea requerida por el profesor.

Ferreiras Asociaciones de clases 54


Pendiente para una próxima versión:
Clase de asociación (Association Class),

Ferreiras Asociaciones de clases 55


Ferreiras Asociaciones de clases 56

También podría gustarte