...
PlantUML Macro |
---|
class CD {
int getTrackCount()
Track getTrack(int)
void addTrack(Track)
void removeTrack(Track)
}
class Track {
}
CD --> "*" Track: tracks |
| Code Block |
---|
public class CD {
private List<Track> tracks = new ArrayList<Track>();
public int getTrackCount() {
return tracks.size();
}
public Track getTrack(int index) {
return tracks.get(index);
}
public void addTrack(Track track) {
if (! tracks.contains(track)) {
tracks.add(track);
}
}
public void removeTrack(Track track) {
tracks.remove(track);
}
} |
| Vi ser at tracks-assosiasjonen er kapslet inn med en rekke metoder og at realiseringen bruker en intern ArrayList. Alle innkapslingsmetodene kaller bare tilsvarende metoder i ArrayList-objektet, uten noe særlig mer logikk. Vi sier at CD delegerer til ArrayList. Selv om vi hadde lagt til litt validering og annen logikk, så hadde alt grovarbeidet i praksis blitt utført av ArrayList-klassen, og uten mulighet til å delegere og dermed (gjen)bruke logikken i ArrayList-klassen, så ville CD-klassen blitt mye mer kompleks. Dette er typisk for delegeringsteknikken: - Den delegerende klassen har et internt objekt av delegat-klassen, altså objektet som det delegeres til, som gjør det meste av grovarbeidet.
- Den delegerende klassen har metoder med samme eller lignende navn som delegat-klassen har, og disse .
- Disse metodene delegerer mer eller mindre direkte til delegat-objektet.
Hvis en tegner hva som skjer i et sekvensdiagram så blir delegeringen åpenbar: PlantUML Macro |
---|
Hovedprogram --> CD: getTrackCount
CD --> "tracks: ArrayList": size
Hovedprogram --> CD: getTrack
CD --> "tracks: ArrayList": get
Hovedprogram --> CD: addTrack
CD --> "tracks: ArrayList": add
Hovedprogram --> CD: removeTrack
CD --> "tracks: ArrayList": remove
|
|
I dette tilfellet er det faktum at en bruker delegering ikke på noen måte synlig utenifra, fordi det ArrayList-objektet opprettes internt i klassen og det gis ingen direkte tilgangen til det, siden det jo er kapslet inn. Men i mange tilfeller er litt av poenget at en utenifra kan styre hvilket objekt det delegeres til.
...