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 HighscoreListListener 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 konsollen som legges til lista og skriver ut lista hver gang et nytt resultat faktisk blir lagt til.
Exercise-panelet
Bruk av Exercise-panelet er obligatorisk for denne øvingen. Du må ha panelet åpent med HighscoreList.ex-filen (tests > patterns.observable > HighscoreList.ex) i før du begynner med oppgaven. For mer informasjon/hjelp, se nederst på forrige side, altså hovedsiden for Øving 8.
Del 1: Implementasjon av HighscoreList
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:
|
Testkode for denne oppgaven finner du her: patterns/observable/HighscoreListTest.java. Original-koden (jextest) finner du her: patterns/observable/HighscoreList.jextest.
Del 2: Hovedprogramklasse
Klassediagrammet viser hvordan klassene henger sammen, og vårt forslag til metoder. | 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:
|
Ekstraoppgave
Implementer en HighscoreList som håndterer resultater for TicTacToe, Sokoban, Sudoku eller ditt selvvalgte spill. 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. Resultatene legges inn i highscore-listen, som printes etter at spilleren har fått mulighet til å registrere sitt resultat.