Versions Compared

Key

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

...

PlantUML Macro
interface StringGrid {
	getRowCount()
	getColumnCount()
	getElement(int row, int column)
}

class StringGridImpl {
}

StringGrid <|.. StringGridImpl

interface "Iterator<String>" as iterator {
	boolean hasNext()
	String next()
}

class StringGridIterator {
	int row
	int column
}

iterator <|.. StringGridIterator
StringGridIterator -left-> "1" StringGrid: grid

Dette klassediagrammet illustrerer forholdet mellom grensesnittetene StringGrid og StringGridIterator og klassen StringGridImpl.

StringGridImpl inneholder begge 0, 1 eller flere String-objekter. StringGrid deklarerer metoder som StringGridImpl må implementere, og som gir tilgang til String-objektene den inneholder.

StringGridIterator implementerer Iterator<String> og må derfor implementere hasNext() og next(). Den har en assosiasjon til en StringGrid og hasNext()- og next()-metodene brukes for å iterere over String-objektene som det assosierte StringGrid-objektet inneholder.

Internt bruker StringGridIterator-objekter row- og column-attributtene for å holde rede på hvilket String-objekt som neste kall til next() skal returnere. hasNext() må bruke row og column og StringGrid-objektet sine getRowCount()- og getColumnCount()-metoder for å si om iterasjonen er ferdig, og next() må bruke row og column og StringGrid-objektet sin getElement(int, int)-metode for å få tak i riktig String-objekt. Hvert kall til next() må dessuten øke column og evt. row (og nullstille column) slik at iterasjonen går forover og til neste linje.

Her er det ikke tatt hensyn til rowMajor-logikken, som oppgaven etterspør, men det endrer ikke så mye, kun hvilken av column og row som økes først.

PlantUML Macro
object "StringGridImpl" as stringGrid {
	"en" "to" "tre"
	"fire" "fem" "seks"
}

object "StringGridIterator" as iterator00 {
	row = 0
	column = 0
}
iterator00 --> stringGrid: stringGrid


object "StringGridIterator" as iterator01 {
	row = 0
	column = 1
}
iterator01 --> stringGrid: stringGrid

iterator00 ..> iterator00: hasNext() => true
iterator00 ..> iterator01: next() => en


object "StringGridIterator" as iterator02 {
	row = 0
	column = 2
}
iterator02 --> stringGrid: stringGrid

iterator01 ..> iterator01: hasNext() => true
iterator01 ..> iterator02: next() => to


object "StringGridIterator" as iterator10 {
	row = 1
	column = 0
}
iterator10 --> stringGrid: stringGrid

iterator02 ..> iterator02: hasNext() => true
iterator02 ..> iterator10: next() => tre


object "StringGridIterator" as iterator11 {
	row = 1
	column = 1
}
iterator11 --> stringGrid: stringGrid

iterator10 ..> iterator10: hasNext() => true
iterator10 ..> iterator11: next() => fire

object "StringGridIterator" as iterator12 {
	row = 1
	column = 2
}
iterator12 --> stringGrid: stringGrid

iterator11 ..> iterator11: hasNext() => true
iterator11 ..> iterator12: next() => fem

object "StringGridIterator" as iterator20 {
	row = 2
	column = 0
}
iterator20 --> stringGrid: stringGrid

iterator12 ..> iterator12: hasNext() => true
iterator12 ..> iterator20: next() => seks


iterator20 ..> iterator20: hasNext() => false



Dette objekttilstandsdiagrammet viser en objektstruktur med et StringGridImpl-objekt, som inneholder to rader og tre kolonner med seks String-objekter, og hvordan en (og samme) StringGridIterator utvikler seg over tid gjennom en iterasjon over String-objektene som StringGridImpl-objektet inneholder, altså "en", "to", "tre", "fire", "fem" og "seks". Vi ser at StringGridIterator-objektet hele tiden er koblet til samme StringGridImpl-objekt og at det eneste som endrer seg er row, column-attributtene, som går gjennom alle par fra 0, 0 til og med 1, 2 og stopper på 2, 0 (siden 2 >= antall rader). Her er det ikke tatt hensyn til rowMajor-logikken, som oppgaven etterspør, men det endrer ikke så mye, kun hvilken av column og row som økes først.

Merk at i dette eksemplet er StringGridIterator-objektet koblet til et StringGridImpl-objekt, men at det godt kunne vært en hvilken som helst instans av en klasse som implementerer StringGrid.

 

...