Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Excerpt

Denne oppgaven handler om å bruke observatør-observert-teknikken for å bli informert om endringer i en HighscoreListhighscore-instansliste.

Observatør-observert-teknikken går ut på at det observerte objektet sier ifra til en eller flere observatører om at tilstanden er endret. I denne oppgaven skal vi lage en HighscoreList som kan si fra til lyttere av typen ListListener når nye resultater blir registrert. En hovedprogramklasse kalt HighscoreProgram vil bli brukt til å sjekke at det virker. Denne klassen oppretter en HighscoreList-instans, legger inn resultater (tall) fra konsollet som legges til lista og skriver ut lista hver gang et nytt resultat faktisk blir lagt til.

...

PlantUML Macro
class ObservableList {
	Collection<Object> elements
	int size()
	Object getElement(int)
	{abstract} boolean acceptsElement(Object)
	#addElement(int, Object)
	#addElement(Object)
	#removeElement(int)
 	addListListener(ListListener)
	removeListListener(ListListener)
}

class HighscoreList {
	int maxSize
	HighscoreList(int)
	boolean acceptsElement(Object)
	void addResult(int)
}

ObservableList <|-- HighscoreList

interface ListListener {
	listChanged(ObservableList, int)
}
ObservableList -right-> "*" ListListener: listListeners

class HighscoreProgram {
	HighscoreList highscoreList
	void init()
	void run()
}
ListListener <|.. HighscoreProgram

Klassediagrammet viser hvordan klassene henger sammen, og hvor metodene nå er deklarert/implementert. Merk at addElement- og removeElement-metodene er angitt som protected (ruter-symbolet), slik at kun subklasser skal kunne bruke dem.

Den abstrakte superklassen ObservableList skal legges til som en generell superklasse for observerbare lister, som HighscoreList skal arve fra. Denne klassen skal både holde en liste med objekter (Object) og håndtere registrering av lyttere, altså en liste med ListListener-instanse, som får beskjed om endringer i lista (slik at lista dermed er observerbar). Dette betyr at ObservableList overtar håndtering av både resultater og lyttere fra HighscoreList-klassen. For å gjøre ObservableList mer generell og gjenbrukbar, så lar vi den håndtere Object-instanser (heller enn Integer). Samtidig deklarerer den en abstrakt metode acceptsElement, som subklasser må redefinere for å bestemme hva slags objekter det skal være lov å legge inn. HighscoreList vil f.eks måtte redefinere den slik at bare Integer-objekter aksepteres.

ObservableList skal ha følgende metoder (noen er altså overtatt fra HighscoreList):

  • int size() - returnerer antall elementer i lista
  • Object getElement(int) - returnerer elementet i posisjonen angitt av argumentet
  • abstract boolean acceptsElement(Object) - returnerer hvorvidt subklassen aksepterer at objektet legges inn i lista (f.eks. aksepterer HighscoreList kun Integer-objekter).
  • void addElement(int, Object) - legger til et element på posisjonen angitt av argumentet, men bare dersom det aksepteres som element. Dersom elementet ikke aksepteres, så skal IllegalArgumentException utløses. Dersom posisjonen er ulovlig så skal IndexOutOfBoundsException utløses.
  • void addElement(Object) - legger til et element bakerst i lista, men bare dersom det aksepteres som element. Dersom elementet ikke aksepteres, så skal IllegalArgumentException utløses.
  • void removeElement(int) - fjerner elementet på posisjonen angitt av argumentet. Dersom posisjonen er ulovlig så skal IndexOutOfBoundsException utløses.

HighscoreList skal endres slik at den i størst mulig grad bruker metodene som arves fra ObservableList, men forøvrig ikke endrer oppførsel. Kjør hovedprogramklassen HighscoreProgram for å sjekke at dette faktisk stemmer.

 

 

JExercise-testkode for denne oppgaven finner du her: patterns/observable/ObservableListTest.java. Original-koden (jextest) finner du her: patterns/observable/ObservableList.jextest.

Ekstraoppgave

Implementer en HighscoreList HighscoreList som håndterer resultater for TicTacToe, Sokoban eller Sudoku. Etter hvert ferdige spill skal spilleren få mulighet til å legge inn resultatene i en highscore-liste, som består av navn på spilleren og antall trekk. Hvert resultat lagres som et eget objekt, og denne resultatobjektklassen må implementere Comparable-grensesnitt. Resultatobjektet Resultatene legges inn i highscore-listen, som printes etter at spilleren har fått mulighet til å registrere sitt resultat.

 

Include Page
Bunntekst for JExercise-oppgaver
Bunntekst for JExercise-oppgaver