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 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 et 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 de det eneste som endrer seg er pos-attributetattributtet, 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



 

...