1) A: Facade B: Strategy C: Proxy D: Mediator E: Iterator
2)
Samma uppgift som förra årets ordinarie tenta (110524) fast fjärilsnamnen
är utbytta mot liknande namn:
3a) I AbstractAnimalAnimator definieras den
abstrakta metoden init() .
init() anropas, trots att den är abstrakt, i en annan metod
(konstruktormetoden) i samma klass. Den abstrakta metoden definieras konkret i en
subklass (detta är mönstret Template Method).
I subklassen ButterflyAnimator definieras init()
konkret. Varje subklass till AbstractAnimalAnimator måste definiera
sin egen init() som gör aktuell initiering i konstruktorn,
alltså den initiering som behövs i den aktuella subklassen.
3b) public void move();
4a) I vattenfallsmetoden sker testning i slutet av projektet, i agila
metoder sker testning kontinuerligt (åtminstone väldigt ofta) av hela systemet.
I vattenfallsmetoden är det svårt att ändra på redan utförda
delar. Planering av projektet sker i början och planeringen följs.
I agila tekniker är man ständigt beredd på ändrade krav som leder
till ändringar i redan färdiga programdelar.
4b) T.ex. parprogrammering, kundrepresentation i projektet, utvecklingen sker
i iterationer om 1-2 veckor, alla utvecklare har tillgång till all kod, refactoring
(förbättring av koden utan att funktionen ändras) sker ofta.
Fler karakteristika finns på föreläsningsanteckningarna.
4c) En prototyp är ett program där all
funktionalitet "syns" men inte fungerar fullt ut. I Rapid Prototyping
vill man snabbt visa en icke-teknisk kund vad som går att
göra. Från prototypen väljs en funktion (funktionalitet i programmet,
ej kodmässig funktion) i taget och utvecklas i en interativ process.
5) Model = data och metoder (algoritmer) som
representerar aktuellt problem. Det finns ingen grafik i Model.
View = En grafisk bild av modellen. View har en referens till
Model så att aktuella data kan hämtas och rätt
ögonblicksbild ritas.
Control = Interaktion med användaren, t.ex. genom knappar,
menyer, slidebars ... Modellen uppdateras och View ritas om enligt direktiv
som avkodas av Control-delen.
6a) Varje new RationNumber(..., ...) ger ett nytt objekt av
RationNumber . Detta sker 11 gånger så
rätt svar är B. Varje objekt läggs in i
två listor men ingen kopiering sker, samma objekt finns i
båda listorna.
6b) Parametern till Collections.sort(...)
måste vara en lista med objekt som har
typen Comparable eller
Comparable<T> . Utvidga RationalNumber
så att den
implementerar Comparable<RationalNumber> . Då
måste metoden
public int compareTo(RationalNumber r)
definieras. Metoden jämför två objekt
av RationalNumber och talar om vilket som ska
komma först vid sortering eller om objekten är lika.
class RationalNumber implements Comparable {
public int compareTo(RationalNumber r) {
...
}
....
}
7a) Exmplet visar hur en klassmetod anrops (via klassnamnet).
Den createPerson() som definieras i klassen
Person är en instansmetod. Instansmetoder anropas via
referenser till objekt och existerar bara i samband med objekt (instanser).
En fabriksmetod är alltid en klassmetod men här är man
av misstag definierat en instansmetod och försöker använda den
som klassmetod. Ett felmeddelande i stil med följande kommer att ges
... createPerson cannot be referenced from a static context ...
7b) Markera metoden createPerson med modifieraren
static , alltså inled deklarationen med
public static Person createPerson
7c) Gör konstruktorn till Person
private . Då kan konstruktorn bara anropas inuti
Person .
7d) En abstrakt klass går inte att instantiera. Inled klassdefinitionen med
abstract class Classname
7e) Dynamisk bindning
I superklassen A definieras en abstrakt metod m() .
Definiera subklasser till A , definiera om metoden m()
i varje subklass. Via referenser av typ A kan metoden m()
anropas även för objekt av alla subklasser. Det är då subklassens typ som bestämmer vilken
metod m() som exekveras, alla subklasserna har ju olika varianter.
När anropet a.m(); kompileras går det inte att avgöra vilken metod som ska
köras, det avgörs under programmets körning, dynamiskt.
7f) Klasser som inte ska instansieras används gärna som biblioteksmoduler.
I en klass läggs hjälpmetoder som inte ska anropas knutna till några objekt.
Typexempel i Javas bibliotek är Math . Där ligger metoder
och konstanter, alla markerade static .
Åtkomst sker via klassnamet, t.ex. så här:
y = Math.sin(Math.E)/Math.cos(Math.sqrt(Math.PI));
8a) Metoderna largestFile() och addPrefix() :
File largestFile() {
return this;
}
void addPrefix() {
name = "F:" + name;
}
8b)
class Directory extends FileElement {
ArrayList<FileElement> theFiles;
Directory (String n) {
super(n);
theFiles = new ArrayList<FileElement>();
}
public void add(FileElement fe) {
theFiles.add(fe);
fe.parent = this;
}
public void remove(FileElement fe) { // Not required in exam!
fe.parent = null;
theFiles.remove(fe);
}
File largestFile() {
int max = 0;
File fm = null, f = null;
for (FileElement fe : theFiles) {
f = fe.largestFile();
if (f != null) {
int tmp = f.size;
if (tmp > max) {
max = tmp;
fm = f;
}
}
}
return fm;
}
void addPrefix() {
name = "D:" + name;
for (FileElement fe : theFiles)
fe.addPrefix();
}
}
8c)
Flera objekt vill prenumerera på information från en filkatalog.
Då är mönstret Observer det rätta. Låt varje filkatalog
(Directory) utgöra Subject i en Observer-konstellation.
Ett Subject har en lista av prenumeranter som kommer att underrättas när
någon ändring sker. Objekten som vill ha information om ändringar är
Observers i mönstret. De ska ha metoden update() som anropas
automatiskt från Subject då Subject ändras.
I update() skrivs den kod som ritar upp (för grafisk bild) och
skriver (för icke-grafisk) information om aktuellt kataloginnehåll.
|