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

Compare with Current View Page History

« Previous Version 19 Next »


Denne oppgaven bruker delegeringsteknikken for å modellere arbeidsfordeling på en “vanlig” arbeidsplass. Denne oppgaven kan muligens oppleves som mindre meningsfull. Dette er kanskje omtrent tilsvarende hvor meningsløst noen typer kontorarbeid kan virke.

Vi skal i dette scenarioet ha en sjef, eller Manager, som har én eller flere arbeidere, eller Clerks, altså i en såkalt én-til-mange relasjon. Et Employee-grensesnitt definerer en oppførsel som er felles for de ansatte, og implementeres av både Manager og Clerk.

Employee-objekter på denne simulerte arbeidsplassen har to oppgaver:

  • utskrift av dokumenter
  • utførelse av matematiske beregninger

Del 1: Employee, Clerk og Printer

Employee-grensesnittet har følgende metoder:

  • double doCalculations(BinaryOperator<Double> operation, double value1, double value2) - regner ut resultatet av å utføre operation med argumentene value1 og value2

  • void printDocument(String document) - Printer document. Hvordan dette gjøres avhenger av den spesifikke implementasjonen.

  • int getTaskCount() - returnerer hvor mange oppgaver (beregninger og printinger) som har blitt utført av eller på vegne av dette Employee-objektet
  • int getResourceCount() - antallet employees til rådighet, inkludert Employee-objektet metoden blir kalt på. En Employee skal altså medregne seg selv i antall ressurser den ansatte har til rådighet. Dette tallet skal inkludere alle Employee-objekter nedover i hierarkiet.

Lag dette grensesnittet, og lag så en Clerk-klasse som implementerer det. Clerk må ha følgende konstruktør:

  • Clerk(Printer printer)

Clerk-klassen må inneholde egen logikk for å løse doCalculations, men skal altså delegere printDocuments til Printer-objektet gitt i konstruktøren.

Definer en Printer-klasse med følgende metoder:

  • void printDocument(String document, Employee employee) - skriver documentet til konsollen og tar vare på dokumentet i employee sin historikk

  • List<String> getPrintHistory(Employee employee) - returnerer en List<String> med alle dokumentene som har blitt printet av employee i rekkefølgen de har blitt printet

La så Clerk delegere printDocument til Printer. Siden Clerk ikke har noen andre ansatte å delegere til, vil getResourceCount() alltid være 1.

Testkode for Clerk er her: delegation/office/ClerkTest.java Originalkoden for testen(jextest) kan du finne her: delegation/office/Clerk.jextest

Testkode for Printer er her: delegation/office/PrinterTest.java Originalkoden for testen(jextest) kan du finne her: delegation/office/Printer.jextest

Del 2: Manager

Vi definerer så sjefen til de hardt-arbeidende Clerk-objektene. Manager-klassen har følgende konstruktør:

  • Manager (Collection<Employee> employees) - utløser et IllegalArgumentException dersom employees er tom

La så Manager implementere Employee-grensesnittet. Implementer Managers oppgaver ved å delegere alle videre til en av arbeiderne i listen med Employee-objekter gitt i konstruktøren. Regelen for hvilken Employee som får hvilken oppgave delegert til seg kan du bestemme selv, men prøv å gjøre det slik at arbeidet fordeles jevnt på alle. Mens Clerk altså har kun én tilgjengelig ressurs vil Manager-objekter vil ha flere.


Testkode for Manager er her: delegation/office/ManagerTest.java Originalkoden for testen(jextest) kan du finne her: delegation/office/Manager.jextest

Del 3: Hovedprogram

Lag et hovedprogram som illustrerer hva som skjer med effektiviteten når vi legger til flere nivåer med mellomledere.

Lag først et Manager-objekt som blir tildelt noen Clerk-objekter under seg. Presentér deretter effektiviteten av hierarkiet ved å skrive ut getTaskCount()/getResourceCount() for Manager-objektet. Vis deretter hvordan effektiviteten faller når vi legger til nivåer med mellomledere ved å lage to eller flere nivåer med Manager, hvor lederne på bunnen tildeles Clerk-objekter, og skriv ut den nye effektiviteten for topplederne.

.ex for bruk med Exercise-panelet finner du her: Office.ex.


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