You are on page 1of 14

UNMSM Anlisis y Diseo de Algoritmos

Relaciones entre clases: agregacin y composicin


Hasta el momento ya hemos estudiado las relaciones de DEPENDENCIA y
ASOCIACIN. La DEPENDENCIA indica cmo una instancia de una clase usa a
una instancia de otra clase, slo por un corto perodo de tiempo, mientras
que la ASOCIACIN representa cmo dos clases se relacionan entre s de una
forma ms prolongada en el tiempo.

Dentro de la ASOCIACIN existen dos subtipos de relaciones que representan


realidades ms particulares, y para ello hace uso de una relacin del tipo
parte/todo. Estas relaciones son las de AGREGACIN y de COMPOSICIN.

Veamos un ejemplo para entender este concepto. Imaginemos a una


computadora, la cual est conformada por un monitor, un case, un mouse,
un teclado y dos parlantes. Vemos como los elementos anteriores conforman
a la computadora, cmo representamos esto en UML?, pues de la siguiente
manera:

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

El diagrama anterior se lee de la siguiente manera:

Una computadora est formada por un monitor.


Una computadora est formada por un teclado.
Una computadora est formada por un mouse.
Una computadora est formada por un case.
Una computadora est formada por muchos parlantes.

Vemos tambin que cada clase del tipo parte es agregada como un atributo
en la clase del tipo todo, de forma similar a la asociacin (recordar que la
agregacin es un caso particular de la asociacin). Entonces, ahora s
definamos a la agregacin.

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Relacin de AGREGACIN
Definicin
La relacin de agregacin es una relacin que indica que un objeto de una
clase (conocida como "PARTE") es parte de otro objeto de otra clase
(conocida como "TODO"). En esta relacin si el TODO es eliminado, las
PARTES no necesariamente sern eliminadas.

Notacin
Se representa con una lnea continua que tiene en uno de sus extremos un
rombo con un color de relleno blanco. A la clase A se le conoce como
parte, y a la clase B como todo.

ClaseA

ClaseB

Formas de lectura
Un objeto de la clase A es parte de un objeto de la clase B
Un objeto de la clase A conforma a un objeto de la clase B
Un objeto de la clase B posee a un objeto de la clase A

Forma de implementacin
Por medio de un atributo de un objeto de la clase B en la clase A.
Tambin, aunque no es obligatorio pero s recomendable, es una buena

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

prctica que para las agregaciones de 1 a muchos se aada a la clase B un


mtodo llamado agregar o add, el cual tiene como finalidad agregar un
elemento de la parte al todo, otro denominado get u obtener, el cual
obtiene una parte del todo y otro denominado remove el cual elimina
una parte del todo.

Ejemplo
Tenemos el siguiente contexto: Una fbrica de autos est construyendo un
nuevo prototipo de un auto, en particular se est enfocando en mejorar el
tiempo de vida de las llantas. Como sabemos que un auto est conformado
por cuatro llantas, podemos representar esta realidad de la siguiente
manera:

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Notar como es que hemos agregado los mtodos add, get y remove.
No confundir el mtodo getLlanta con el de getLlantas.

El cdigo en Java sera:

Clase Llanta.java
public class Llanta{
private String tiempoDeVida;
public Llanta(){
}
public String getTiempoDeVida() {
return tiempoDeVida;
}
public void setTiempoDeVida(String tiempoDeVida) {
this.tiempoDeVida = tiempoDeVida;
}
}

Clase Auto.java
public class Auto{
private String modelo;
private Llanta[] llantas;
public Auto(){
llantas = new Llanta[4];
}
/*MTODOS DE LA AGREGACIN (NO SON OBLIGATORIOS)*/
public void addLlanta(Llanta llanta){
if(llantas.length < 4){
llantas[llantas.length] = llanta;
}else{
System.out.println("Las cuatro llantas estn puestas");
}
}

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos


public Llanta getLlanta(int i){
Llanta llanta = null;
if(i < 4){
llanta = llantas[i];
}else{
System.out.println("No existe la llanta en la posicin "+i);
}
return llanta;
}
public void removeLlanta(int i){
if(i < 4){
if(i < llantas.length){
Llanta[] llantasAux = new Llanta[4];
int k = 0;
for(int j=0; j<llantas.length; j++){
if(j != i){
llantasAux[k] = llantas[j];
k++;
}
}
llantas = llantasAux;
}else{
System.out.println("No existe la llanta en la posicin "+i);
}
}else{
System.out.println("No existe la llanta en la posicin "+i);
}
}
/*MTODOS GET Y SET*/
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
public Llanta[] getLlantas() {
return llantas;
}
public void setLlantas(Llanta[] llantas) {
this.llantas = llantas;
}
}

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

En este caso, como el contexto del problema es una fbrica de autos que
est haciendo pruebas para mejorar el tiempo de vida de sus llantas,
podemos deducir que si el auto en general es destruido, las llantas no
necesariamente sern destruidas, ya que pueden cambiarse a otro auto, por
lo tanto hacemos bien en usar una relacin de AGREGACIN para
representar el contexto del problema.

Por ejemplo, podemos crear una clase llamada Programa en el cual veamos
actuar a la agregacin:

Clase Programa.java
public class Programa{
public static void main(String[] args){
/*Creamos cuatro
Llanta llanta1 =
Llanta llanta2 =
Llanta llanta3 =
Llanta llanta4 =

llantas*/
new Llanta();
new Llanta();
new Llanta();
new Llanta();

/*Creamos un auto*/
Auto auto = new Auto();
/*Colocamos las llantas en el auto*/
auto.addLlanta(llanta1);
auto.addLlanta(llanta2);
auto.addLlanta(llanta3);
auto.addLlanta(llanta4);
/*Destruimos el auto*/
auto = null;
System.out.println("Auto destruido");
/*Las llantas an existen*/
System.out.println("Llanta 1:
System.out.println("Llanta 2:
System.out.println("Llanta 3:
System.out.println("Llanta 4:

"+llanta1);
"+llanta2);
"+llanta3);
"+llanta4);

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos


}

Aqu primero creamos cuatro llantas y un auto, ahora al auto le agregamos


las cuatro llantas para luego destruir el auto. Como estamos hablando de
una AGREGACIN, al destruir el auto las llantas deberan de seguir
existiendo, por lo que slo la variable auto est en null, mientras que las
cuatro variables llanta siguen instanciadas.

Nuevamente recordamos, en la clase Auto hemos implementado los


mtodos addLlanta, getLlanta y removeLlanta los cuales no son
obligatorios de implementar, y deberan de implementarse slo si ayudan a
representar el contexto del problema o facilitan la solucin de este.

Relacin de COMPOSICIN
Definicin
La relacin de agregacin es una relacin que indica que un objeto de
una clase (conocida como "PARTE") es parte de otro objeto de otra clase
(conocida como "TODO"). Si el "TODO" llegase a ser eliminado,
necesariamente las "PARTES" tambin deben de ser eliminadas.

Notacin
Se representa con una lnea continua que tiene en uno de sus extremos un
rombo con un color de relleno oscuro. A la clase "A" se le conoce como
"parte", y a la clase "B" como "todo".
Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Formas de lectura
"Un objeto de la clase A es parte de un objeto de la clase B"
"Un objeto de la clase A conforma a un objeto de la clase B"
"Un objeto de la clase B posee a un objeto de la clase A"

Formas de implementacin
Por medio de un atributo de un objeto de la clase "B" en la clase "A".
Tambin, aunque no es obligatorio pero s recomendable, es una buena
prctica que para las agregaciones de 1 a muchos se aada a la clase "B" un
mtodo llamado "agregar" o "add", el cual tiene como finalidad agregar un
elemento de la "parte" al "todo", otro denominado "get" u "obtener", el cual
obtiene una "parte" del "todo" y otro denominado "remove" el cual elimina
una "parte" del "todo", aunque no es obligatorio.

Ejemplo
Continuemos con el ejemplo anterior para entender este concepto. Tenemos
el siguiente contexto: Una fbrica de autos est construyendo un nuevo
prototipo de un auto, en particular se est enfocando en verificar que tan
rpido puede ir el auto hasta que el motor se sobrecaliente y explote. Como

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

sabemos que un auto est conformado por cuatro llantas, podemos


representar esta realidad de la siguiente manera:

Al igual que el ejemplo anterior, debemos notar como es que hemos


agregado los mtodos add, get y remove. No confundir el mtodo
getLlanta con el de getLlantas.

El cdigo en Java, tanto para la clase Llanta como para la clase Auto ser
el mismo que en la AGREGACIN, sin embargo para ver el funcionamiento de
la COMPOSICIN crearemos un nuevo main:

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

Clase Programa.java
public class Programa{
public static void main(String[] args){
/*Creamos cuatro
Llanta llanta1 =
Llanta llanta2 =
Llanta llanta3 =
Llanta llanta4 =

llantas*/
new Llanta();
new Llanta();
new Llanta();
new Llanta();

/*Creamos un auto*/
Auto auto = new Auto();
/*Colocamos las llantas en el auto*/
auto.addLlanta(llanta1);
auto.addLlanta(llanta2);
auto.addLlanta(llanta3);
auto.addLlanta(llanta4);
/*Destruimos el auto*/
auto = null;
llanta1 = null;
llanta2 = null;
llanta3 = null;
llanta4 = null;
System.out.println("Auto destruido");
/*Las llantas an existen*/
System.out.println("Llanta 1: "+llanta1);
System.out.println("Llanta 2: "+llanta2);
System.out.println("Llanta 3: "+llanta3);
System.out.println("Llanta 4: "+llanta4);
System.out.println("Llantas destrudas");
}
}

Aqu, a diferencia del ejemplo anterior, al destruir el auto tambin debemos


destruir las llantas, por lo que hacemos null a las cuatro llantas.

Debemos recalcar que como el contexto del problema es una fbrica de


autos que est haciendo pruebas para verificar cunta velocidad soporta un
auto antes de explotar, podemos deducir que si el auto en general es
destruido, las llantas tambin sern necesariamente destruidas, por lo
Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos

tanto hacemos bien en usar una relacin de COMPOSICIN para representar


el contexto del problema.

Por otro lado, tambin es posible representar la COMPOSICIN en cdigo


instanciando en el constructor las variables PARTES que deban ser
destruidas junto con el TODO. En este caso tendramos lo siguiente:

Clase Llanta.java
public class Llanta{
private String tiempoDeVida;
public Llanta(){
}
public String getTiempoDeVida() {
return tiempoDeVida;
}
public void setTiempoDeVida(String tiempoDeVida) {
this.tiempoDeVida = tiempoDeVida;
}
}

Clase Auto.java
public class Auto{
private String modelo;
private Llanta[] llantas;
public Auto(){
llantas = new Llanta[4];
/*Creamos internamente las llantas*/
for(int i=0; i<4; i++){
llantas[i] = new Llanta();
}
}
/*MTODOS DE LA AGREGACIN (NO SON OBLIGATORIOS)*/
public void addLlanta(Llanta llanta){

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos


if(llantas.length < 4){
llantas[llantas.length] = llanta;
}else{
System.out.println("Las cuatro llantas estn puestas");
}
}
public Llanta getLlanta(int i){
Llanta llanta = null;
if(i < 4){
llanta = llantas[i];
}else{
System.out.println("No existe la llanta en la posicin "+i);
}
return llanta;
}
public void removeLlanta(int i){
if(i < 4){
if(i < llantas.length){
Llanta[] llantasAux = new Llanta[4];
int k = 0;
for(int j=0; j<llantas.length; j++){
if(j != i){
llantasAux[k] = llantas[j];
k++;
}
}
llantas = llantasAux;
}else{
System.out.println("No existe la llanta en la posicin "+i);
}
}else{
System.out.println("No existe la llanta en la posicin "+i);
}
}
/*MTODOS GET Y SET*/
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
public Llanta[] getLlantas() {
return llantas;
}
public void setLlantas(Llanta[] llantas) {
this.llantas = llantas;

Prof. Alonso Ral Melgarejo Galvn

UNMSM Anlisis y Diseo de Algoritmos


}
}

Para este caso, al instanciar un nuevo auto, internamente en el constructor


tambin se estaran instanciado las llantas. Si escribimos en el main lo
siguiente:

Clase Programa.java
public class Programa{
public static void main(String[] args){
/*Creamos un auto, internamente se crean tambin las llantas*/
Auto auto = new Auto();
/*Destruimos el auto*/
auto = null;
System.out.println("Auto y llantas destruidos");
}
}

Al destruir nuestra variable auto hacindola null, tambin estamos


destruyendo a las llantas.

Por ltimo, hay que tener en cuenta que mientras que un contexto usamos la
relacin de AGREGACIN entre auto y llanta, bajo otro contexto usamos la
relacin de COMPOSICIN, por lo tanto la eleccin del uso de una o de la
otra relacin depender del problema y del contexto que all se presente.

Prof. Alonso Ral Melgarejo Galvn

You might also like