Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3
Excerpt

På denne siden vises klasse- og objekttilstandsdiagrammer for løsningen, som hjelp til å skrive selve koden.

PlantUML Macro
interface CardContainer {
	getCardCount()
	getCard(int)
}

class CardDeck {
}
class CardHand {
}

CardContainer <|.. CardDeck
CardContainer <|.. CardHand

class Card {
	char suit
	int face
}

CardDeck "0" *--> "*" Card: cards
CardHand "0" *--> "*" Card: cards

interface "Iterator<Card>" as cardIterator {
	boolean hasNext()
	Card next()
}

class CardContainerIterator {
	int pos
}

cardIterator <|.. CardContainerIterator
CardContainerIterator -left-> "1" CardContainer: cardContainer

Dette klassediagrammet illustrerer forholdet mellom grensesnittet grensesnittetene CardContainer og CardContainerIterator og klassene CardDeck, CardHand og Card.

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

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

Internt bruker CardContainerIterator-objekter et pos-attributt for å holde rede på hvilket Card-objekt som neste kall til next() skal returnere. hasNext() må bruke pos og CardContainer-objektet sin getCardCount()-metode for å si om iterasjonen er ferdig, og next() må bruke pos og CardContainer-objektet sin getCard(int)-metode for å få tak i riktig Card-objekt. Hvert kall til next() må dessuten øke pos, slik at iterasjonen går forover.

PlantUML Macro
object "CardDeck" as cardDeck {
}
object "#card0 : Card" as card1 {
	suit = 'S'
	face = 1
}
object "#card1 : Card" as card2 {
	suit = 'S'
	face = 2
}
object "#card2 : Card" as card3 {
	suit = 'H'
	face = 1
}
cardDeck *--> card1: cards
cardDeck *--> card2: cards
cardDeck *--> card3: cards

object "CardContainerIterator" as iterator0 {
	pos = 0
}
iterator0 --> cardDeck: cardContainer


object "CardContainerIterator" as iterator1 {
	pos = 1
}
iterator1 --> cardDeck: cardContainer

iterator0 ..> iterator0: hasNext() => true
iterator0 ..> iterator1: next() => #card0


object "CardContainerIterator" as iterator2 {
	pos = 2
}
iterator2 --> cardDeck: cardContainer

iterator1 ..> iterator1: hasNext() => true
iterator1 ..> iterator2: next() => #card1


object "CardContainerIterator" as iterator3 {
	pos = 3
}
iterator3 --> cardDeck: cardContainer

iterator2 ..> iterator2: hasNext() => true
iterator2 ..> iterator3: next() => #card2
iterator3 ..> iterator3: hasNext() => false



Dette objekttilstandsdiagrammet viser en objektstruktur med et CardDeck-objekt, som inneholder tre Card-objekter, og hvordan en (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-attributtet, 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.

 

HTML Comment
hiddentrue
PlantUML Macro
object "CardDeck" as cardDeck0 {
}
object "#card0 : Card" as card10 {
	suit = 'S'
	face = 1
}
object "#card1 : Card" as card20 {
	suit = 'S'
	face = 2
}
object "#card2 : Card" as card30 {
	suit = 'H'
	face = 1
}
cardDeck0 *--> card10: cards
cardDeck0 *--> card20: cards
cardDeck0 *--> card30: cards

object "CardContainerIterator" as iterator0 {
	pos = 0
}
iterator0 --> cardDeck0: cardContainer


object "CardDeck" as cardDeck1 {
}
object "#card0 : Card" as card11 {
	suit = 'S'
	face = 1
}
object "#card1 : Card" as card21 {
	suit = 'S'
	face = 2
}
object "#card2 : Card" as card31 {
	suit = 'H'
	face = 1
}
cardDeck1 *--> card11: cards
cardDeck1 *--> card21: cards
cardDeck1 *--> card31: cards

object "CardContainerIterator" as iterator1 {
	pos = 1
}
iterator1 --> cardDeck1: cardContainer

iterator0 ..> iterator0: hasNext() => true
iterator0 ..> iterator1: next() => #card0


object "CardDeck" as cardDeck2 {
}
object "#card0 : Card" as card12 {
	suit = 'S'
	face = 1
}
object "#card1 : Card" as card22 {
	suit = 'S'
	face = 2
}
object "#card2 : Card" as card32 {
	suit = 'H'
	face = 1
}
cardDeck2 *--> card12: cards
cardDeck2 *--> card22: cards
cardDeck2 *--> card32: cards

object "CardContainerIterator" as iterator2 {
	pos = 2
}
iterator2 --> cardDeck2: cardContainer

iterator1 ..> iterator1: hasNext() => true
iterator1 ..> iterator2: next() => #card1


object "CardDeck" as cardDeck3 {
}
object "#card0 : Card" as card13 {
	suit = 'S'
	face = 1
}
object "#card1 : Card" as card23 {
	suit = 'S'
	face = 2
}
object "#card2 : Card" as card33 {
	suit = 'H'
	face = 1
}
cardDeck3 *--> card13: cards
cardDeck3 *--> card23: cards
cardDeck3 *--> card33: cards

object "CardContainerIterator" as iterator3 {
	pos = 3
}
iterator3 --> cardDeck3: cardContainer

iterator2 ..> iterator2: hasNext() => true
iterator2 ..> iterator3: next() => #card2
iterator3 ..> iterator3: hasNext() => false