Aggregation und Komposition: Unterschied zwischen den Versionen

Aus KGS-Wiki
(Seite angelegt)
 
(→‎Umsetzung in Java: Beispiele erweitert)
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 11: Zeile 11:


In einem [[UML]]-[[Klassendiagramm]] wird die Aggregation durch einen Pfeil dargestellt, dessen Pfeilrichtung vom Teil zum Ganzen zeigt und dessen Spitze eine weiß gefüllte Raute ◇ ist.
In einem [[UML]]-[[Klassendiagramm]] wird die Aggregation durch einen Pfeil dargestellt, dessen Pfeilrichtung vom Teil zum Ganzen zeigt und dessen Spitze eine weiß gefüllte Raute ◇ ist.
=== Umsetzung in Java ===
<syntaxhighlight lang="java" line="1">
public class ProjectTeam {
    private ArrayList<Employee> team;
    public ProjectTeam() {
        team = new ArrayList<Employee>();
    }
    public void addEmployee(Employee e) {
        team.add(e);
        e.setTeam(this);
    }
    public void removeEmployee(Employee e) {
        team.remove(e);
        e.endProject();
    }
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
public class Employee {
    private ProjectTeam team;
    public Employee() {
    }
    public void setTeam(ProjectTeam t) {
        if(this.team != null) {
            this.team.removeEmployee(this);
        }
        this.team = t;
        if (t != null) {
            t.addEmployee(this);
        }
    }
    public void endProject() {
        this.team = null;
    }
}
</syntaxhighlight><code>Employee</code>-Objekte dürfen auch <code>null</code> als <code>team</code>-Attribut haben. In diesem Fall sind sie (kurzzeitig) ohne Projekt angestellt.


== Komposition ==
== Komposition ==
Zeile 23: Zeile 67:


In einem [[UML]]-[[Klassendiagramm]] wird die Komposition durch einen Pfeil dargestellt, dessen Pfeilrichtung vom Teil zum Ganzen zeigt und dessen Spitze eine schwarz gefüllte Raute ♦ ist.
In einem [[UML]]-[[Klassendiagramm]] wird die Komposition durch einen Pfeil dargestellt, dessen Pfeilrichtung vom Teil zum Ganzen zeigt und dessen Spitze eine schwarz gefüllte Raute ♦ ist.
===Umsetzung in Java===
<syntaxhighlight lang="java" line="1">
public class Building {
    private ArrayList<Room> rooms;
    public Building() {
        rooms = new ArrayList<Room>();
    }
    public void addRoom(Room r) {
        if (r.getBuilding() == this) {
            rooms.add(r);
        }
    }
}
</syntaxhighlight><syntaxhighlight lang="java" line="1">
public class Room {
    private final Building building;
    public Room(Building b) {
        this.building = b;
        b.addRoom(this);
    }
}
</syntaxhighlight><code>Room</code>-Objekte können ''nur'' unter Angabe eines <code>Building</code>-Objekts erzeugt werden. Das Schlüsselwort <code>final</code> stellt sicher, dass das Attribut <code>building</code> nach dem Erzeugen des Objekts nicht mehr verändert werden kann.
== Weblinks ==
* [https://www.youtube.com/watch?v=sN2_CoB_kbw YouTube: UML Class and Object Diagrams | Association vs. Aggregation vs. Composition | Geekific {{Flagge|GB}}]


[[Kategorie:Objektorientierte Programmierung]]
[[Kategorie:Objektorientierte Programmierung]]

Aktuelle Version vom 28. September 2023, 08:58 Uhr

Aggregation und Komposition sind zwei Beziehungstypen aus der objektorientierten Modellierung, genauer: zwei Teil-eines-Ganzen-Beziehungen.

Aggregation

Eine Aggregation

Kennzeichnend für eine Aggregation ist, dass die Teile auch unabhängig vom Ganzen funktionieren können. In dem abgebildeten Beispiel wäre das Angestellty der Teil und das ProjektTeam das Ganze. Das Angestellty würde aber im Regelfall auch nach dem Ende des Projekts noch angestellt bleiben, dürfte in der Datenmodellierung weiter existieren und könnte ggf. neuen Projekten zugeordnet werden.

In einem UML-Klassendiagramm wird die Aggregation durch einen Pfeil dargestellt, dessen Pfeilrichtung vom Teil zum Ganzen zeigt und dessen Spitze eine weiß gefüllte Raute ◇ ist.

Umsetzung in Java

public class ProjectTeam {
    private ArrayList<Employee> team;

    public ProjectTeam() {
        team = new ArrayList<Employee>();
    }

    public void addEmployee(Employee e) {
        team.add(e);
        e.setTeam(this);
    }

    public void removeEmployee(Employee e) {
        team.remove(e);
        e.endProject();
    }


}
public class Employee {
    private ProjectTeam team;

    public Employee() {
    }

    public void setTeam(ProjectTeam t) {
        if(this.team != null) {
            this.team.removeEmployee(this);
        }
        this.team = t;
        if (t != null) {
            t.addEmployee(this);
        }
    }

    public void endProject() {
        this.team = null;
    }
}

Employee-Objekte dürfen auch null als team-Attribut haben. In diesem Fall sind sie (kurzzeitig) ohne Projekt angestellt.

Komposition

Eine Komposition

Anders als bei der Aggregation kann bei der Komposition der Teil nicht unabhängig vom Ganzen existieren. In dem abgebildeten Beispiel wäre der Raum der Teil und das Gebäude das Ganze. Ein Raum kann aber nicht ohne ein Gebäude existieren; wenn ein Gebäude abgerissen wird, verschwinden auch alle ihm zugehörigen Räume.

In einem UML-Klassendiagramm wird die Komposition durch einen Pfeil dargestellt, dessen Pfeilrichtung vom Teil zum Ganzen zeigt und dessen Spitze eine schwarz gefüllte Raute ♦ ist.

Umsetzung in Java

public class Building {
    private ArrayList<Room> rooms;

    public Building() {
        rooms = new ArrayList<Room>();
    }

    public void addRoom(Room r) {
        if (r.getBuilding() == this) {
            rooms.add(r);
        }
    }
}
public class Room {
    private final Building building;

    public Room(Building b) {
        this.building = b;
        b.addRoom(this);
    }
}

Room-Objekte können nur unter Angabe eines Building-Objekts erzeugt werden. Das Schlüsselwort final stellt sicher, dass das Attribut building nach dem Erzeugen des Objekts nicht mehr verändert werden kann.

Weblinks