Versions Compared

Key

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

...

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 grensesnittetene CardContainer og CardContainerIterator og klassene CardDeck, CardHand og Card.

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 forvoverforover.

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

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


object "CardDeckCardContainerIterator" as cardDeck1 {
}
object "#card0 : Card" as card11iterator1 {
	suitpos = 'S'
	face = 1
}
object "#card1 : Card" as card21 {
	suit = 'S'
	face = 2
}
object "#card2 : Card" as card31 {
	suit = 'H'
	face = 1
}
cardDeck1iterator1 --> cardDeck: cardContainer

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


object "CardContainerIterator" as iterator2 {
	pos = 2
}
iterator2 --> card11cardDeck: cardscardContainer

cardDeck1iterator1 --..> card21iterator1: cards
cardDeck1 --> card31: cards hasNext() => true
iterator1 ..> iterator2: next() => #card1


object "CardContainerIterator" as iterator1iterator3 {
	pos = 13
}
iterator1iterator3 --> cardDeck1cardDeck: cardContainer

iterator0iterator2 ..> iterator0iterator2: hasNext() => true
iterator0iterator2 ..> iterator1iterator3: next() => #card0


#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



...

 

 

...