Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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.

...