© 1999-2003, Flemming Koch Jensen
Alle rettigheder forbeholdt
Observer Pattern

Vejledning løsninger
Opgaver

 

 

  Det er en forudsætning for løsningen af de følgende opgaver, at man kan anvende en af java's Collection-klasser. I de vejledende løsninger er anvendt LinkedList (fra java.util).
   
1

I denne opgave skal du implementere en simpelt anvendelse af Observer Pattern. Bemærk at du ikke skal anvende Java's understøttelse af Observer Pattern, men selv lave implementationen fra bunden.

  Klassediagrammet er som følger:
Figur 1:
Klasse-diagrammet
  AlarmObserver holder øje med om tilstanden i Subject kommer over en vis værdi. AlarmObserver modtager denne grænseværdi som den anden parameter til sin konstruktor. Hvis Subjects tilstand overstiger grænseværdien udskrive AlarmObserver teksten: "Alarm!".
  Hver gang PrintObserver får besked om en tilstandsændring skriver den, den nye værdi ud på skærmen.
  Klassen ConSubject og interfacene Subject og Observer er som beskrevet i afsnittet "Implementation" i kapitlet om Observer Pattern. Disse er i klassediagrammet markeret med grå.
  Lav en passende testanvendelse.
   
2 [Forudsætning: At man har løst den foregående opgave]
Lav refactoring af den foregående opgave, så den anvender Java's understøttelse af Observer Pattern.
 
3 I denne opgave skal du anvende Java's understøttelse af Observer Pattern.
Vores Subject skal være en instans af klassen Ship, vel at mærke en af den slags der kan synke! Observerne skal alle være instanser af Person - personer der alle kommer med en bemærkning, når det skib de observerer synker.
Ship skal have en tilstand der beskriver om skibet stadig er flydende eller er ved at synke. Der skal være en get-metode til tilstanden og en metode sink som ændrer skibet tilstand fra flydende til synkende (et skib er initielt flydende).
Enhver Person har et navn, samt en bemærkning, der venter på at blive udtrykt. Ud over disse, tager konstruktoren et Ship som parameter, hos hvilket personen tilmelder sig som Observer. Når Person'ens update-metode bliver kaldt, vil denne reagere ved at udskrive sin bemærkning.
 
4 [Ikast Handelsskole: Datamatiker - Praktisk Prøve i Programkonstruktion, 29/4-99: Opgave nr. 7]
[Forudsætning: Singleton Pattern]
Når man udvikler en applikation kan det være nyttigt at have et bestemt vindue som man kan bruge mere eller mindre globalt uden at alle objekter der vil bruge det behøver konkret at have en reference til det. Vi vil anvende Singleton Pattern for at opnå denne tilgang. Vi vil kalde Singleton-klassen HovedVindue.
Vi vil her kun lave en uhyre simpel implementation af denne klasse, da det er Singleton-egenskaben vi er interesseret i, og ikke vindues-egenskaberne. Den eneste vindues-egenskab vi vil implementere er derfor størrelsen af vinduet, altså dets bredde og højde.
1. Implementer klassen HovedVindue som Singleton. Udstyr den med passende variable til at beskrive dens størrelse og lav en metode:
 
ændreStørrelse( int nyBredde, int nyHøjde )
  til at sætte højden og bredden til nye værdier. Initialiser i konstructoren størrelsen med bredden 0 og højden 0.
2. HovedVindue skal have et par nyttige klasser til testformål. Lav en metode navn, der returnerer en tekststreng med indholdet "Hoved vindue". Lav ligeledes en metode toString, der returnerer en tekststreng der beskriver HovedVindue's størrelse. Hvis f.eks. bredden er 200 og højden er 150 skal toString returnere teksten: "[bredde=200, højde=150]".

Der skal nu laves en Observer, der kan arbejde med HovedVindue som Subject. Observer-klassen kalder vi Abonnent. Først vil vi lave klassen Abonnent (delopgave 3) og dernæst de nødvendige udvidelser af HovedVindue, så den kan fungere som Subject (delopgave 4).
3. Implementer klassen Abonnent. Den skal have en konstructor der tager en tekststreng som parameter. Dette vil være Observerens navn. Lav en metode:
 
vindueÆndret( HovedVindue vindue )
  som HovedVindue kalder når der sker en ændring i dens størrelse. Metoden skal udskrive Abonnent'ens navn samt HovedVindue'ts navn og nye størrelse. Hvis Abonnent'en hedder "A" og HovedVindue'ts størrelse igen er 200 i bredden og 150 i højden, skal den udskrive: "A: Hoved vindue er ændret til [bredde=200, højde=150]"
4.

Udvid implementationen af HovedVindue, så den får en metode ændret, der giver alle tilknyttede Abonnent'er besked om, at der er sket en ændring af vinduets størrelse. Lav ligeledes en metode:

 
tilføjAbonnent( Abonnent nyAbonnent )
  der føjer en ny Abonnent til som ObserverHovedVindue't. Anvend i denne forbindelse java.util.LinkedList som container for Abonnent'erne.
5. Lav en klasse Test, der med en main-metode afprøver implementationen af HovedVindue og Abonnent.

6. Forklar kort hvad der forståes ved henholdvis Push og Pull i forbindelse med Observer pattern.
7. I delopgave 3 blev du bedt om at implementere en metode vindueÆndret. Forklar kort hvorfor parameteren i virkeligheden er unødvendig.