Saltar al contenido principal

Composión

La composición de clases en Java es un patrón de diseño que permite crear clases complejas mediante la combinación de clases más simples. En la composición, una clase contiene referencias a otras clases denominadas "componentes".

Es un tipo de asociación que implica una relación muy fuerte entre las clases. Si la clase contenedora (como un Coche) se destruye, también se destruyen los objetos que contiene (como el Motor). Esto es lo que la diferencia de la asociación.

Ejemplo de composición

Vamos a crear un sistema que modele un coche y su motor como ejemplo de composición.

  1. Definir la clase Motor:

    Motor.java
    public class Motor {
    private String tipo;
    private int potencia;

    public Motor(String tipo, int potencia) {
    this.tipo = tipo;
    this.potencia = potencia;
    }

    public void encender() {
    System.out.println("El motor está encendido.");
    }

    public String getTipo() {
    return tipo;
    }

    public int getPotencia() {
    return potencia;
    }
    }
  2. Definir la clase Coche que utiliza la clase Motor:

    Coche.java
    public class Coche {
    private String marca;
    private String modelo;
    private Motor motor; // Composición: Coche "tiene un" Motor

    public Coche(String marca, String modelo, Motor motor) {
    this.marca = marca;
    this.modelo = modelo;
    this.motor = motor;
    }

    public void conducir() {
    motor.encender(); // Utiliza el motor
    System.out.println("Conduciendo el coche " + marca + " " + modelo);
    }

    public Motor getMotor() {
    return motor;
    }
    }
  3. Ahora podemos utilizar las clases en el método main:

    EjemploComposicion.java
    public class EjemploComposicion {
    public static void main(String[] args) {
    Motor motorV8 = new Motor("V8", 400);
    Coche coche = new Coche("Ford", "Mustang", motorV8);

    coche.conducir(); // Imprime: El motor está encendido. Conduciendo el coche Ford Mustang
    }
    }

Ejemplo de composición con varios componentes del mismo tipo

Cuando una clase está compuesta por varios objetos del mismo tipo, la composición sigue siendo una práctica válida. En este caso, puedes tener una clase que contiene una colección de objetos de un determinado tipo. Este patrón es especialmente común cuando quieres representar un grupo o colección de elementos similares, como varios vehículos, estudiantes, libros, etc.

Supongamos que estamos modelando un Bandera que puede contener múltiples Color. Cada Color representará un color específico que compone la bandera.

  1. Definir la clase Color:

    Color.java
    public class Color {
    private String nombre;
    private String codigoHex;

    public Color(String nombre, String codigoHex) {
    this.nombre = nombre;
    this.codigoHex = codigoHex;
    }

    public String getNombre() {
    return nombre;
    }

    public String getCodigoHex() {
    return codigoHex;
    }
    }
  2. Definir la clase Bandera que contiene múltiples instancias de Color:

    Bandera.java
    import java.util.ArrayList;
    import java.util.List;

    public class Bandera {
    private String pais;
    private ArrayList<Color> colores; // Composición: Bandera "tiene un" listado de Colores

    public Bandera(String pais) {
    this.pais = pais;
    this.colores = new ArrayList<>(); // Inicializamos la lista de colores
    }

    public void addColor(Color color) {
    colores.add(color); // Añadir un nuevo color a la bandera
    }

    public void mostrarColores() {
    System.out.println("Colores de la bandera de " + pais + ":");
    for (Color color : colores) {
    System.out.println(" - " + color.getNombre() + " (Código Hex: " + color.getCodigoHex() + ")");
    }
    }
    }
  3. Ahora podemos utilizar las clases en el método main:

    EjemploComposicionVariasClases.java
    public class EjemploComposicionVariasClases {
    public static void main(String[] args) {
    Bandera banderaBrasil = new Bandera("Brasil");

    Color verde = new Color("Verde", "#009639");
    Color amarillo = new Color("Amarillo", "#FFD700");
    Color azul = new Color("Azul", "#3E4095");
    Color blanco = new Color("Blanco", "#FFFFFF");

    banderaBrasil.addColor(verde);
    banderaBrasil.addColor(amarillo);
    banderaBrasil.addColor(azul);
    banderaBrasil.addColor(blanco);

    banderaBrasil.mostrarColores();
    }
    }