...
Klassediagram for HighscoreList, ListListener og ObservableList. | En HighscoreList skal holde styr på heltallsresultater (av typen int/Integer). Lista skal være observerbar ved at den kan registrere lyttere (ListListener-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. Merk at første argument til listChanged-metoden er av typen ObservableList. Dette er en abstrakt superklasse for HighscoreList kalt ObservableList, som innføres i del 3 og som da skal holde orden på lista. ObservableList vil ha en del generelle metoder som HighscoreList arver og kan bruke. For å kunne kjøre testene for HighscoreList allerede i del 1, så må ObservableList være definert fra starten. Lag derfor en tom ObservableList-klasse og bruk denne som superklasse for HighscoreList. Klassediagrammet for HighscoreList, ListListener og ObservableList er vist til venstre. Her er en oversikt over metoden som må implementeres:
|
...
Klassediagrammet viser hvordan klassene henger sammen, og vårt forslag til metoder. | Lag en hovedprogramklasse kalt HighscoreProgram, 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 HighscoreProgram implementerer ListListener-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:
Klassediagrammet til venstre viser hvordan klassene henger sammen, og vårt forslag til metoder. |
Del 3: ObservableList
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):
HighscoreList skal endres slik at den i størst mulig grad bruker metodene som arves fra ObservableList, men forøvrig ikke endre oppførsel.endrer oppførsel. Kjør hovedprogramklassen HighscoreProgram for å sjekke at dette faktisk stemmer. Klassediagrammet til venstre 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.
|
JExercise-testkode for denne oppgaven finner du her: patterns/observable/ObservableListTest.java. Original-koden (jextest) finner du her: patterns/observable/ObservableList.jextest.
...