Svar och lösningar till tentamen i DD2385 2017-06-02

1)    A: Observer   B: Strategy   C: Proxy    D: Decorator   E: Facade

2a)   Alla programmets (eller programdelens) funktioner beskrivs i testfall. Alla testfall skrivs före koden. När testfallen uppfylls är programmet/programdelen klart.

2b)   Förbättring av programkoden utan att programmets funktion eller gränssnitt ändras.

3)    CSC

4a)   Composite    4b)   Anrop av superklassens konstruktor   
4c)Klassen Artefact är abstrakt. Då går det inte att skapa objekt av klassen.

5)   B och D är korrekta.

6a)   D är det alternativ som inte går att kompilera eftersom Car är en subklass till Vehicle. Typen för variabeln måste vara Vehicle eller något som är ovanför Vehicle i typhierarkin.

6b)   C och D går att kompilera. Objekttyper som passar som parameter till search() är Motorvehicle och dess subklasser, t.ex. Car.

7)   Klassen A måste implementera interfacet Comparable eller ännu hellre Comparable<A>. Klassen måste ha en metod som anger ordningen mellan två A-objekt genom att returnera ett heltal som är negativt, noll (vid likhet) eller positivt.

    class A implements Comparable<A>{
        public int compareTo(A other) {
            // returnerar heltal beroende på
            // ordningen mellan this och other
        }
    }
  

8)   Rätta svar är A, C, E och F.

9)   Den nya klassen kan ärva från den ena av U1 och U2 och skapa ett objekt av den andra. Det går också bra att låta bli att ärva och skapa objekt av både U1 och U2. Man behöver inte skapa objekt av U3 då metoden som ska användas är static.

      class Application extends U1 {  // Funktioner från U1 finns 
                                      // i Application genom arvet
          U2 u2 = new U2();
      
          void mu2 (int x) {  
	      u2.mu2(x);
          }

          static void mu3 (Object b) {
              U3.mu3(b);
          }
      }
  

10)    En fabriksmetod anropas för att ge objekt av en klass istället för att användaren skapar objekten med new. Vanliga tillämpningar är att användaren av klassen inte får (eller inte ska behöva) välja subklass. Det sköts inuti fabriksmetoden. En annan tillämpning är när man vill ka flera konstruktorer med samma signatur. En fabriksmetod måste vara static. Det måste gå att anropa fabriksmetoden utan att först skapa objekt ur klassen och då är static nödvändigt. Konstruktorn brukar vara private.

11)    Klassen Integer implementerar Comparable<Integer> enligt den naturliga ordningen för heltal. Det betyder att om man sorterar en lista med Integer-objekt så kommer objekten att ordnas i stigande ordning. Lösningen på det givna problemet är att skriva en Comparator eller närmare bestämt en klass som implementerar interfacet Comparator<Integer> och anropa sorteringsmetoden

Collections.sort(intList, dcomp)

där dcomp är komparatorobjektet, ett objekt av följande klass:

	class DComp implements Comparator<Integer> {
	    public int compare(Integer i1, Integer i2) {
	        return -i1.compareTo(i2);
            }
        } 
Metoden compare negerar det naturliga sorteringsvillkoret mellan heltal så att sorteringen görs i fallande ordning. En längre metodkropp som utför jämförelsen mellan i1 och i2 godkänns också.

12)    Klass nr 1, PointHandler är en Observable

    class PointHandler extends Observable {

        Point thePoint;

        void setPoint(Point newP) {
            thePoint = newP;
            notifyObservers(thePoint);
        }
    } 
Klasserna 2 och 3 är båda Observers
Överföringen av information (här Point-objektet) från Observable till Observers kan ske antingen genom att den skickas i metodanropet (här notifyObservers(thePoint)) eller genom att Observer-objektet hämtar informationen via första parametern till metoden update(). I lösningen här används första alternativet.
    class Polygon implements Observer {
    
        ArrayList<Point> points = new ArrayList<Point>();

        public void update(Observable target, Object obj) {
	    points.add((Point)obj);
	    System.out.print("Polygon is now:");
	    for (Point p: points)
	        System.out.print(" " + p);
	    System.out.println();
        }
    }

    class Matrix implements Observer {
        static final int N=8;
        boolean[][] mat = new boolean[N][N];

        public void update(Observable target, Object p) {
	    Point po = (Point) p;
	    int x=po.x, y = po.y;
	    if (x>=0 && x<N && y>=0 && y<N){
	        System.out.println("Position " + p + " is updated");
	        mat[x][y] = true;
	    }
	    else
	        System.out.println("Position " + p + " could not be updated");
	
        }
    }  
Testkoden skapar objekt av klasserna ovan och registrerar polygon-objektet och matris-objektet som observers till punkt-objektet. Varje gång en nytt Point-objekt sätts i PointHandler ges utskrift från Polygon resp. Matrix.
      
        PointHandler handler = new PointHandler();
        Polygon polobserver = new Polygon();
	Matrix matobserver = new Matrix();

	handler.addObserver(polobserver);
	handler.addObserver(matobserver);
	
	handler.setPoint(new Point(0,0));
	handler.setPoint(new Point(4,0));
	handler.setPoint(new Point(5,4));
	handler.setPoint(new Point(2,6));
	handler.setPoint(new Point(-1,4));
  
CSC