...
|
| Klassediagrammet og koden til venstre viser hvordan tracks-assosiasjonen er realisert. Vi ser at den 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. Sekvensdiagrammet til høyre illustrerer hvordan det CD-objektet bruker ArrayList-objektet. 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:
Sekvensdiagrammet illustrerer den generelle teknikken godt, bare bytt ut CD med delegerende og ArrayList med delegat. |
|
...
|
| Vi ser at hvert kall til hasNext() vil resultere i et kall til hasNext() på delegaten (iteratorDelegate). Hvert kall vil next() vil imidlertid gi først et kall til next() på delgaten og så et kall til hasNext() og evt. et nytt kall til next(). Effekten av det andre kallet til next() er å bruke opp / hoppe over annenhvert element: det første elementet brukes, det andre kastes, det tredje brukes og det fjerde kastes osv. hasNext()-kallet er der for å unngå å utløse unntak ved at vi hopper over et element som ikke finnes. Et viktig poeng her, ut over bruken av delegering, er at konstruktøren tar inn delegaten, slik at den som bruker EverySecondIterator, kan bestemme hvilken iterator det delegeres til, dvs. hvor elementene egentlig kommer fra. I følgende kode-eksempel kommer elementene fra en vanlig liste:
En EverySecondIterator-instans kan delegere til en annen EverySecondIterator, for dermed å hoppe over flere elementer:
|
|
...