Klassediagrammer er en illustrasjon av innholdet i og sammenhengen mellom klasser, og fungerer som et supplement til tekstlig kode. Et klassediagram viser klasser som bokser, attributter og operasjoner som tekstlinjer inni boksene (i hver sine deler) og assosiasjoner og arv som streker med og uten piler. I tillegg annoteres assosiasjonsstreker med informasjon om navn og såkalt multiplisitet (også kalt kardinalitet). Figuren under viser et enkelt klassediagram med tilsvarende Java-kode til høyre.
Attributter og assosiasjoner
class Person {
String firstName;
String familyName;
String getFullName();
Collection<Car> cars;
}
class Car {
String brand;
Person owner;
}
| Figuren til venstre viser et UML-klassediagram med to klasser: Person og Car. Person-klassen har to attributter (firstName og familyName) og én metode (getFullName()), mens Car-klassen har ett attributt (brand). Klassene er knyttet sammen gjennom en ownership-assosiasjon, som viser et en-til-mange-forhold mellom Person og Car. Assosiasjonen er annotert med:
Dette betyr at navigasjonen kan foregå slik:
Diagrammet tilsvarer Java-koden til høyre, hvor:
Assosiasjoner i UML har ingen direkte Java-motstykke, men implementeres typisk ved hjelp av referanser mellom objekter. Når én instans kan være koblet til flere andre instanser, brukes Collection, List, Set, eller array i stedet for en enkel variabel. Dersom en assosiasjon hadde et pilhode (retningsbestemt assosiasjon), ville det bety at navigasjonen kun er mulig én vei. I praksis betyr dette at klassen i pilhode-enden ikke ville ha en referanse tilbake til den andre klassen. Hvis for eksempel assosiasjonen i diagrammet pekte fra Person til Car, ville ikke Car-klassen trengt et owner-felt. |
Arv (extends og implements)
Arv gjør at nye klasser kan bygge på eller utvide andre klasser. I klassediagrammer angis det med en spesiell pil fra subklassen til superklassen, med et litt stort pilhode som ikke er fylt. En bruker stiplet linje hvis det er snakk om implementasjon av grensesnitt, og ikke vanlig arv mellom klasser (eller mellom grensesnitt).
interface Observer {
public void update();
}
abstract class AbstractObservable {
private Collection<Observer> observers = new ArrayList<Observer>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
protected void fireUpdate() {
for (Observer observer: observers) {
observer.update(this);
}
}
}
class ConcreteObservable extends AbstractObservable {
}
class ConcreteObserver implements Observer {
public void update(AbstractObservable) {
// method body
}
}
| Figuren til venstre viser et UML-klassediagram for Observatør-observert-teknikken (Observer Pattern). Dette mønsteret brukes for å etablere en en-til-mange-relasjon mellom objekter, der flere observatører kan abonnere på oppdateringer fra et observerbart objekt.
Synlighetsmodifikatorer i diagrammet:
Koden under diagrammet:
Merknader om navnekonvensjoner:I Java brukes ofte "Listener" som suffiks for observatørgrensesnitt, og dermed også for relaterte variabler og metoder:
|
Mellom boksene kan man ha streker og/eller piler som representerer relasjonene mellom klassene. De vanligste er:
- Arv: representeres med en lukket pil, der subklassen peker på superklassen.
- Implementasjon av grensesnitt: representeres med stiplet linje og lukket pil, der klassen som implementerer et grensesnitt peker på grensesnittet som implementeres.
- Toveis assosiasjon: begge klassene vet om hverandre (dvs. at de har en referanse til hverandre). Toveis assosiasjon representeres med en linje mellom to bokser (evt. mellom samme boks om referansen er til et eller flere objekt av samme klasse). På hver ende av linjen står det en rolle og kardinaliteten til referansen på formen "<rolle>: <kardinalitet>". Kardinaliteten kan være representert som ett tall eller *-symbolet.
- Enveis assosiasjon: en klasse vet om en annen klasse og interagerer med den, men denne klassen har ingen referanser til den første og "vet" dermed ikke om den. Enveis assosiasjoner representeres med en åpen pil som peker fra klassen med referansen til klassen som blir referert.
Synlighetsmodifikatorer for attributter og metoder har følgende symboler:
- Public: grønn sirkel
- Protected: gul ruter/diamant
- Private: rød firkant
De kan også representeres med følgende symboler:
- Public: +
- Protected: #
- Private: -
