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 CardContainer og CardContainerIterator og klassene CardDeck, CardHand og Card. StringGrid og StringGridIterator og klassen StringGridImpl.

StringGridImpl CardDeck og CardHand inneholder begge 0, 1 eller flere Card String-objekter. CardContainer  StringGrid deklarerer metoder som CardDeck og CardHand StringGridImpl må implementere, og som gir tilgang til Card String-objektene de den inneholder. Merk at det er implisitt at metodene deklarert i grensesnittet handler om assosiasjonen(e) til Card.

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

Internt bruker CardContainerIterator StringGridIterator-objekter et pos-attributt row- og column-attributtene for å holde rede på hvilket Card String-objekt som neste kall til next() skal returnere. hasNext() må bruke pos row og column og CardContainer StringGrid-objektet sin getCardCountsine getRowCount()- og getColumnCount()-metode metoder for å si om iterasjonen er ferdig, og next()bruke pos og CardContainerbruke row og column og StringGrid-objektet sin getCardgetElement(int, int)-metode for å få tak i riktig Card String-objekt. Hvert kall til next() må dessuten øke pos, column og evt. row (og nullstille column) slik at iterasjonen går forvoverforover 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 CardDeck-objekt, som inneholder tre Card-objekter, og hvordan et (og samme) CardContainerIterator utvikler seg over tid gjennom en iterasjon over Card-objektene som CardDeck-objektet inneholder, altså #card1, #card2 og #card3. Vi ser at CardContainerIterator-objektet hele tiden er koblet til samme CardDeck-objekt og at det eneste som endrer seg er pos-attributet, som går gjennom rekka 0, 1, 2 og stopper på 3 (siden 3 >= antall kort).

Merk at i dette eksemplet er CardContainerIterator-objektet koblet til et CardDeck-objekt, men at det godt kunne vært et CardHand-objekt eller hvilken som helst instans av en klasse som implementerer CardContainer.

 

...