Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Fjernet den grusomme tabell-formateringen

...

Del 1: Implementasjon av HighscoreList

PlantUML Macro
class HighscoreList {
	int maxSize
	List<Integer> results
	HighscoreList(int)
	int size()
	int getElement(int)
	void addResult(int)
	addHighscoreListListener(HighscoreListListener)
	removeHighscoreListListener(HighscoreListListener)
}

interface HighscoreListListener {
	listChanged(HighscoreList, int)
}
HighscoreList -right-> "*" HighscoreListListener: highscoreListListeners

Klassediagram for HighscoreList og HighscoreListListener

En HighscoreList skal holde styr på heltallsresultater (av typen int/Integer). Lista skal være observerbar ved at den kan registrere lyttere (HighscoreListListener-instanser) og si fra til dem når lista blir endret. Lista skal ha en maksimal lengde, som settes i konstruktøren, f.eks. skal en topp 10-liste kunne opprettes med new HighscoreList(10). Nye resultater registreres med metoden addResult(int), som skal finne riktig posisjon og legge resultatet inn (dersom det er godt nok). Dersom lista er for lang, så skal det dårligste resultatet fjernes. NB: Lavest verdi er best, f.eks. antall sekunder på en oppgave eller antall flytt i Sokoban.

HighscoreListListener-grensesnittet er vist i klassediagrammet til venstre og må implementeres av alle klasser som ønsker å fungere som lyttere for HighscoreList-instanser. Lyttere registrerer seg med HighscoreList sin addHighscoreListListener-metode og vil siden få beskjed om nye resultater ved at listChanged-metoden kalles. Argumentene som tas inn er HighscoreList-objektet som ble endret og posisjonen i lista der endringen skjedde.

Her er en oversikt over metoden som må implementeres:

  • HighscoreList(int maxSize) - konstruktøren tar inn maks antall resultater som lista skal kunne holde. Denne verdien må brukes av addResult, slik at resultater som er for dårlige kastes.
  • size() - returnerer antall elementer i lista, som altså aldri skal overstige maks-antallet
  • int getElement(int) - returnerer resultatet i posisjonen angitt av argumentet
  • void addResult(int) - registrere et nytt resultat, og dersom resultatet er godt nok til å komme med på lista, så legges det inn på riktig plass. Dersom lista blir for lang, så må dårligste resultat kastes. Alle registrerte lyttere må få beskjed om en evt. endring av lista, inkludert på hvilken posisjon som ble endret.
  • addHighscoreListListener(HighscoreListListener) - registrerer en ny lytter
  • removeHighscoreListListener(HighscoreListListener) - fjerner en tidligere registrert lytter

Testkode for denne oppgaven finner du her: patterns/observable/HighscoreListTest.java. Original-koden (jextest) finner du her: patterns/observable/HighscoreList.jextest.

...

Klassediagram for HighscoreList og HighscoreListListener:

PlantUML Macro
class HighscoreList {
	int maxSize
	

...

List<Integer> results
	HighscoreList(int)
	int size()
	int getElement(int)
	void addResult(int)
	addHighscoreListListener(HighscoreListListener)
	removeHighscoreListListener(HighscoreListListener)
}

interface HighscoreListListener {
	listChanged(HighscoreList, int)
}
HighscoreList -right-> "*" HighscoreListListener: highscoreListListeners

...

Testkode for denne oppgaven finner du her: patterns/observable/HighscoreListTest.java. Original-koden (jextest) finner du her: patterns/observable/HighscoreList.jextest.

Del 2: Hovedprogramklasse

Lag en hovedprogramklasse kalt HighscoreListProgram, som tester at HighscoreList-klassen din virker som den skal. La den opprette en HighscoreList-instans, lese inn tall fra konsollet (f.eks. med en Scanner og nextInt-metoden) og legge disse inn i lista. Sørg for at HighscoreListProgram implementerer HighscoreListListener-grensesnittet og registrerer seg som lytter på HighscoreList-instansen. La lyttermetoden listChanged skrive ut informasjon og resultatene i HighscoreList-instansen og posisjonsargumentet, slik at du ser at alt virker som det skal.

Vi foreslår følgende metoder og oppførsel:

  • void init() - oppretter en ny HighscoreList og registrerer seg selv (altså HighscoreListProgram-instansen) som lytter
  • void run() - leser inn tall (resultater) fra konsollet og legger dem til i listen
  • void listChanged(HighscoreList, int) - observerer endringer i HighscoreList-instansen og skriver ut posisjonsargumentet, samt selve listen, til konsollen.

Klassediagrammet viser hvordan klassene henger sammen,

...

og vårt forslag til metoder:

PlantUML Macro
class HighscoreList {
	int maxSize
	Collection<Integer> results
	HighscoreList(int)
	int size()
	int getElement(int)
	void addResult(int)
	addHighscoreListListener(HighscoreListListener)
	removeHighscoreListListener(HighscoreListListener)
}

interface HighscoreListListener {
	listChanged(HighscoreList, int)
}
HighscoreList -right-> "*" HighscoreListListener: highscoreListListeners

class HighscoreListProgram {
	HighscoreList highscoreList
	void init()
	void run()
}
HighscoreListListener <|.. HighscoreListProgram

...



Include Page
Bunntekst for oppgaver
Bunntekst for oppgaver

...