| 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 Observer på HovedVindue'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. |
|
|
|
| |