UML - Diagrama de Colaboración

El Diagrama de Colaboración, también conocido como diagrama de comunicación, es un tipo de diagrama de interacción que muestra cómo los objetos interactúan en un contexto particular. Se enfoca en la relación entre los objetos y su colaboración para lograr una funcionalidad específica.

collaboration-diagram

Componentes

  1. Objetos: Representados por rectángulos con el nombre del objeto y su clase.

  2. Enlaces: Líneas que conectan objetos, mostrando la relación y la interacción entre ellos.

  3. Mensajes: Se representa con una pequeña flecha junto a la línea de enlace. La dirección de la flecha va del objeto emisor del mensaje al receptor del mismo. Junto a ella, se coloca el nombre del mensaje y sus argumentos. Se suele acompañar con una secuencia numérica para indicar el orden de las interacciones.

Ejemplo de Aplicación

Este diagrama describe el proceso de un sistema bibliotecario para crear un préstamo de un libro.

library-system

El bibliotecario realiza el préstamo de un libro mediante siguientes pasos:

  • El bibliotecario busca un título específico en el sistema.

  • El sistema muestra la información del título, incluyendo los ejemplares disponibles.

  • El bibliotecario selecciona un ejemplar específico de la lista de disponibles.

  • El sistema muestra información detallada sobre el ejemplar seleccionado.

  • El bibliotecario identifica al prestatario (la persona que tomará el préstamo del libro).

  • El sistema confirma la información del prestatario.

  • El sistema registra la información del préstamo con los detalles del prestatario y el ejemplar seleccionado y confirma la creación del préstamo.

En código Java:

Primero creamos las clases básicas para Titulo, Ejemplar, Prestatario, y Prestamo:


  public class Titulo {
      private String nombre;

      public Titulo(String nombre) {
          this.nombre = nombre;
      }

      public String getNombre() {
          return nombre;
      }
  }

  public class Ejemplar {
      private Titulo titulo;
      private boolean disponible;

      public Ejemplar(Titulo titulo) {
          this.titulo = titulo;
          this.disponible = true; // Por defecto el ejemplar está disponible
      }

      public Titulo getTitulo() {
          return titulo;
      }

      public boolean isDisponible() {
          return disponible;
      }

      public void setDisponible(boolean disponible) {
          this.disponible = disponible;
      }
  }

  public class Prestatario {
      private String nombre;

      public Prestatario(String nombre) {
          this.nombre = nombre;
      }

      public String getNombre() {
          return nombre;
      }
  }

  public class Prestamo {
      private Ejemplar ejemplar;
      private Prestatario prestatario;

      public Prestamo(Ejemplar ejemplar, Prestatario prestatario) {
          this.ejemplar = ejemplar;
          this.prestatario = prestatario;
      }

      public Ejemplar getEjemplar() {
          return ejemplar;
      }

      public Prestatario getPrestatario() {
          return prestatario;
      }
  }
                
                

Luego creamos la clase VentanaDePrestamos, que representa la lógica de interacción entre el bibliotecario y el sistema:


  public class VentanaDePrestamos {

      public Titulo encontrarTitulo(String nombre) {
          // Lógica para encontrar el título en la base de datos
          return new Titulo(nombre);
      }

      public Ejemplar encontrarEjemplar(Titulo titulo) {
          // Lógica para encontrar un ejemplar disponible del título
          return new Ejemplar(titulo);
      }

      public Prestatario identificarPrestatario(String nombre) {
          // Lógica para identificar al prestatario
          return new Prestatario(nombre);
      }

      public Prestamo crearPrestamo(Prestatario prestatario, Ejemplar ejemplar) {
          // Lógica para crear el registro del préstamo
          return new Prestamo(ejemplar, prestatario);
      }
  }
                
                

Finalmente podríamos tener una clase principal para ejecutar el flujo del préstamo:


  public class SistemaBiblioteca {
      public static void main(String[] args) {
          VentanaDePrestamos ventana = new VentanaDePrestamos();

          Titulo titulo = ventana.encontrarTitulo("Don Quijote de la Mancha");
          Ejemplar ejemplar = ventana.encontrarEjemplar(titulo);
          Prestatario prestatario = ventana.identificarPrestatario("Juan Pérez");

          if (ejemplar.isDisponible()) {
              Prestamo prestamo = ventana.crearPrestamo(prestatario, ejemplar);
              System.out.println("Préstamo creado para el prestatario: " + prestamo.getPrestatario().getNombre());
          } else {
              System.out.println("El ejemplar no está disponible.");
          }
      }
  }
                
                

Propósito

  • Visualizar Interacciones: Muestra cómo colaboran los distintos objetos en un proceso.

  • Análisis y Diseño: Ayuda en el análisis y diseño, al detallar cómo los componentes trabajarán juntos.

  • Complemento a Diagramas de Secuencia: Se puede usar con diagramas de secuencia para tener una visión más completa de cómo funciona un sistema.

Ventajas

  • Claridad en Relaciones: Muestra cómo los objetos están conectados y cómo colaboran.

  • Enfoque en Colaboración: Útil para comprender las relaciones y dependencias entre diferentes partes de un sistema.

  • Complementa otros Diagramas: Da una perspectiva diferente en comparación con los diagramas de secuencia, centrándose en las conexiones en lugar del orden temporal.

Desventajas

  • Menos Enfoque en el Tiempo: No hace foco en el aspecto temporal de las interacciones.

  • Complejidad en Sistemas Grandes: Puede volverse complejo y difícil de seguir en procesos con muchas interacciones y objetos.

Uso

  • Diseño de Software: Usado durante la fase de diseño.

  • Modelado de Negocios: Aplicable en el modelo de procesos de negocio, para visualizar la interacción entre diferentes entidades de negocio.

Conclusiones

El diagrama de colaboración es útil para visualizar las interacciones y colaboraciones entre objetos en un proceso, mediante una perspectiva clara de las relaciones y dependencias.

Su uso es especialmente relevante en las etapas de análisis y diseño de software y para modelar procesos de negocios.