You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

Denne oppgaven handler om å bruke observatør-observert-teknikken for å holde et HighscoreProgram oppdatert når resultater legges inn i en HighscoreList.

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 et HighscoreProgram som oppdaterer en HighscoreList etter hvert som ulike resultater blir registrert i konsollen.

Del 1: Implementasjon av HighscoreList

En HighscoreList skal holde styr på alle resultater av typen Comparable i en egen observerbar liste. Listen skal ha en maksimal størrelse, som settes i konstruktøren (f.eks. skal en topp 10 liste settes som HighscoreList(10) ). Klassen skal implementere grensenittet Iterable<Comparable>, som gjør at man kan iterere over resultatene i listen. HighscoreList må ha en metode for å legge til resultater i listen, addItem(Comparable). Denne metoden sorterer resultatet inn på rett plass i listen og hiver ut det siste/dårligste resultatet i listen hvis den er blitt for lang.

HighscoreListen blir observert av ListListeners. Disse objektene skal gis beskjed om endringer i listen og hvilke elementer som er endret. Dette gjøres i metoden fireListChanged(int, int), som forteller alle ListListeners hvilke elementer som har blitt endret (f.eks. fra og med element 3 til og med element 10). HighscoreList må også ha metodene addListListener(ListListener) og removeListListener(ListListener), som henholdsvis legger til og fjerner observerende ListListeners.

 

JExercise-testkode for denne oppgaven finner du her: inheritance/HighscoreListTest.java (legg til inheritance/TestListener.java i samme mappe som HighscoreList). Original-koden (jextest) finner du her: inheritance/HighscoreList.jextest.

Del 2: Hovedprogram HighscoreProgram

Et HighscoreProgram inneholder en HighscoreList med én ListListenerHighscoreProgram. Klassen må derfor implementere grensesnittet ListListener:

public interface ListListener {
    public void listChanged(AbstractObservableList list, int start, int end);
}

Klassen har følgende metoder:

  • void init() - oppretter en ny HighscoreList og legger til seg selv som ny ListListener.
  • void run() - leser inn tall (resultater) fra konsollen og legger dem til i listen.
  • void listChanged(AbstractObservableList, int, int) - observerer endringen i listen og skriver ut endringene i listen, samt selve listen, til konsollen.

 

Del 3: AbstractObservableList

Den abstrakte superklassen AbstractObservableList skal legges til som en generell superklasse for observerbare lister, som HighscoreList skal arve fra. Denne klassen skal holde oversikt over alle ListListeners som følger en klasse, og håndtere endringer i observatører (dermed kan noe av funksjonaliteten til HighscoreList flyttes opp til superklassen).

AbstractObservableList har i tillegg metoder for å legge og fjerne elementer i den observerbare listen i subklassen

  • void addListListener(ListListener) - legger til en ny ListListener i listen.
  • void removeListListener(ListListener) - fjerner en eksisterende ListListener fra listen.
  • abstract List getList() - returnerer den observerbare listen i subklassen.
  • int size() - returnerer størrelsen på den observervare listen.
  • void addElement(int, Object) - legger til et element i den observervare listen på posisjonen angitt av argumentet.
  • void removeElement(int) - fjerner et element i den observervare listen på posisjonen angitt av argumentet.
  • void fireListChanged(int, int) - informerer alle observerende ListListeners om endringer i den observerbare listen og hvilke elementer i den observerbare listen som er endret.

Hint: En AbstractObservableList har ikke direkte tilgang til den observerbare listen til subklassen. Hvilken inngangsmetode kan man benytte for å gjøre endringer i den observerbare listen?

 

Ekstraoppgave

Implementer en HighscoreList 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 Comparablegrensesnittet. Et nytt resultatobjekt legges så inn i highscorelistemn

 


JExercise lar deg sjekke din egen kode vha. forhåndslagde JUnit-tester og JExercise-panelet

Bruk av JExercise:

  1. Sørg for at jexercise-standalone.jar er lagt til i ditt prosjekts Build Path. Dette må gjøres hver gang du oppretter et nytt prosjekt, og det er derfor lurt å gjenbruke samme prosjekt til alle oppgaver.
  2. JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
  3. Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
  4. Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet. 
  5. Testene kan så kjøres ved å dobbeltklikke på testen som ønskes kjørt.

Ved trøbbel, se først om du finner løsningen i Løsninger på trøbbel med JExercise.

Unknown macro: {html}

Twitre gjerne om oppgaven når du er ferdig: <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="jexercise">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>

  • No labels