Todos los sistemas se construyen a partir de muchas clases y objetos cuya colaboración permite lograr el comportamiento deseado en el sistema. La colaboración entre objetos imponen la existencia de relaciones ( relationship) entre ellos: principalmente asociaciones ( associations) y agregaciones ( aggregations).
Una asociación es una relación entre instancias de clases. No se trata de un flujo de datos entre las clases, sino que se trata de una relación estructural que entre los objetos instancias de dichas clases, especificando que los objetos de una clase deben ``conocer'' de alguna manera los objetos de la otra. Por ejemplo:
Es habitual nombrar las asociaciones generalmente con verbo activo o una frase verbal que recoge el significado de la asociación. También se puede optar por utilizar roles que nombran las clases que intervienen en la asociación con un ( role name) que denote el propósito o la característica por la que una clase se asocia con otra. Un rol es simplemente la cara que la clase de un extremo de la asociación presenta a la clase del otro extremo. Además una asociación puede incluir la multiplicidad asociada a cada una de las clases que intervienen, determinando el número de objetos que participan en la relación.
Al margen de su nombre y su multiplicidad una asociación puede tener una navegación ( navigability) asociada. Si sólo existe la navegación en un sentido hablamos de asociación unidireccional, si se permite la navegación en ambos sentidos de la asociación hablamos de asociación bidireccional.
Desde una perspectiva conceptual, las asociaciones representan relaciones conceptuales entre clases; desde el punto de vista de la especificación, las asociaciones representan responsabilidades; y desde una perspectiva de implementación una asociación se traduce en punteros entre las clases relacionadas.
Como hemos mencionado, una asociación normal representa una relación estructural entre iguales, es decir, las clases asociadas están conceptualmente en el mismo nivel, sin ser ninguna más importante que la otra. Por contra una agregación es una asociación especializada en la cual un todo se relaciona con sus partes. También se la suele denominar como la relación ``parte de''. El que una relación sea modelada como una asociación o como una agregación es a menudo dependiente del dominio. UML ofrece una variedad más fuerte de agregación llamada composición ( composition) (sección 3.5). En este tipo de agregación el objeto parte debe pertenecer sólo a un todo, y además, los objetos parte viven y mueren con el todo.
Independientemente de su naturaleza asociativa o de agrupación, ambas relaciones pueden ser reflexivas. En una relación reflexiva sobre una clase, los objetos de dicha clase se comunican unos con otros. Este hecho aparece reflejado en el diagrama de clases como una asociación o agregación reflexiva.
En cuanto a la dependencia, la mayoría de las veces su utilización en el contexto de las clases va ligada a las operaciones, indicando que una clase utiliza otra como argumento en la signatura de una operación (figura 3.1).
También encontramos frecuentemente relaciones de dependencia entre paquetes de clases. Si un paquete A depende de un paquete B, entonces hay una o más clases en el paquete A que inician comunicación con una o más clases públicas del paquete B.