1 
         
       |  
         Først laver vi Regner 
          med set-konstruktor og metoden f: 
     | 
 
      |  
       |  
        
           
             
              public class Regner {
  private double k;
  
  public Regner( double k ) {
    this.k = k;
  }
  
  public double f( double x ) {
    return k*x*x + 3;
  }
} | 
           
         
     | 
 
      |  
       | Konstanten k udgør datakernen, og alt laves med 
         double. 
     | 
 
      |  
       | Dernæst lave RegnerHandle: 
     | 
 
      |  
       |  
        
           
             
              public class RegnerHandle {
  private Regner objekt;
  
  public RegnerHandle( Regner objekt ) {
    setObjekt( objekt );
  }
  
  public double f( double x ) {
    return objekt.f( x );
  }
  
  public void setObjekt( Regner objekt ) {
    this.objekt = objekt;
  }
} | 
           
         
     | 
 
      |  
       |  
         Datakernen er referencen til det objekt som handle repræsenterer. 
     | 
 
      |  
       | Set-konstruktoren anvender set-metoden, og f 
        delegerer blot opgaven videre til objektet. 
     | 
 
      |  
       | Endelig har vi en testanvendelse, der udfylder de to roller: Opbygger 
        af objektsystemet og klient-rollen. 
     | 
 
      |  
       |  
        
           
             
              public class Main {
  public static void main( String[] argv ) {
    // Opbygger objektsystem
    Regner k3 = new Regner( 3 );
    RegnerHandle ref = new RegnerHandle( k3 );
    
    // Klient
    System.out.println( ref.f( 4.0 ) );
    
    // Ændrer objektsystem
    Regner k5 = new Regner( 5 );
    ref.setObjekt( k5 );
    
    // Klient
    System.out.println( ref.f( 4.0 ) );
  }
} | 
           
         
     | 
 
      |  
       |  
        
           
       | 
 
      | 2 
       | Først laver vi klassen Bog, 
        med set-konstruktor og de tre metoder: setPris, 
         addAntal og subAntal: 
     | 
 
      |   
       |  
        
           
             
              public class Bog {
  private String titel;
  private String forfatter;
  private double pris;
  private int antal;
  
  public Bog( String titel, String forfatter, double pris, int antal ) {
    this.titel = titel;
    this.forfatter = forfatter;
    this.pris = pris;
    this.antal = antal;
  }
  
  public Bog( Bog other ) {
    this( other.titel, other.forfatter, other.pris, other.antal );
  }
  
  public void setPris( double pris ) {
    this.pris = pris;
  }
  
  public void addAntal( int antal ) {
    this.antal += antal;
  }
  
  public void subAntal( int antal ) {
    if ( this.antal - antal >= 0 )
      this.antal -= antal;
  }
  
  public String toString() {
    return "[" + titel + ", " + forfatter + ", " +
                 pris + " kr., antal: " + antal + "]";
  }
} | 
           
         
     | 
 
      |   
       | Dernæst laver vi testanvendelsen med de to instanser af Bog. 
        Vi kalder en række af metoderne med efterfølgende testudskrifter: 
     | 
 
      |  
       |  
        
           
             
              public class Main {
  
  public static void main( String[] argv ) {
    Bog deitel = new Bog( "Java: how to program", "Deitel & Deitel", 497.00, 8 );
    Bog horton = new Bog( "Beginning Java 2", "Ivor Horton", 495.00, 3 );
    
    System.out.println( deitel );
    System.out.println( horton );
    
    deitel.subAntal( 2 );
    System.out.println( deitel );
    
    horton.setPris( 395.00 );
    System.out.println( horton );
    
    horton.addAntal( 3 );
    System.out.println( horton );
  }
} | 
           
         
     | 
 
      |  
       |  
        
           
             
              [Java: how to program, Deitel & Deitel, 497.0 kr., antal: 8]
[Beginning Java 2, Ivor Horton, 495.0 kr., antal: 3]
[Java: how to program, Deitel & Deitel, 497.0 kr., antal: 6]
[Beginning Java 2, Ivor Horton, 395.0 kr., antal: 3]
[Beginning Java 2, Ivor Horton, 395.0 kr., antal: 6]  | 
           
         
     | 
 
      |   
       | Handle-klassen laves dernæst: 
     | 
 
      |   
       |  
        
           
             
              public class BogHandle {
  private Bog bogen;
  
  public BogHandle( Bog bog ) {
    setObject( bog );
  }
  
  public void setObject( Bog bog ) {
    bogen = bog;
  }
  
  public void setPris( double pris ) {
    bogen.setPris( pris );
  }
  
  public void addAntal( int antal ) {
    bogen.addAntal( antal );
  }
  
  public void subAntal( int antal ) {
    bogen.subAntal( antal );
  }
  
  public String toString() {
    return bogen.toString();
  }
} | 
           
         
     | 
 
      |   
       | I forbindelse med testanvendelsen bruger vi det samme handle-objekt 
        for at illustrere muligheden for at udskifte det objekt som handle håndterer: 
     | 
 
      |  
       |  
        
           
             
              public class Main {
  
  public static void main( String[] argv ) {
    Bog horton = new Bog( "Beginning Java 2", "Ivor Horton", 495.00, 3 );
    BogHandle handle = new BogHandle( horton );
    System.out.println( handle );
    
    handle.addAntal( 8 );
    System.out.println( handle );
    
    Bog deitel = new Bog( "Java: how to program", "Deitel & Deitel", 497.00, 8 );
    
    handle.setObject( deitel );
    System.out.println( handle );
    handle.setPris( 299.00 );
    System.out.println( handle );
  }
} | 
           
         
     | 
 
      |  
       |  
        
           
             
              [Beginning Java 2, Ivor Horton, 495.0 kr., antal: 3]
[Beginning Java 2, Ivor Horton, 495.0 kr., antal: 11]
[Java: how to program, Deitel & Deitel, 497.0 kr., antal: 8]
[Java: how to program, Deitel & Deitel, 299.0 kr., antal: 8]  | 
           
         
          
       | 
 
      | 3 
       | Først laver vi Punkt. 
     | 
 
      |  
       |  
        
           
             
              public class Punkt {
  private double x, y;
  
  public Punkt( double x, double y ) {
    this.x = x;
    this.y = y;
  }
  
  public double getX() {
    return x;
  }
  
  public double getY() {
    return y;
  }
} | 
           
         
     | 
 
      |  
       | Da koordinatsystemet arbejder med R2, har vi valgt 
        at bruge double. 
     | 
 
      |  
       | Dernæst laver vi Linie: 
     | 
 
      |  
       |  
        
           
             
              public class Linie {
  private Punkt start, slut;
  
  public Linie( Punkt start, Punkt slut ) {
    this.start = start;
    this.slut = slut;
  }
  
  public double length() {
    double deltaX = start.getX() - slut.getX();
    double deltaY = start.getY() - slut.getY();
    
    return Math.sqrt( deltaX * deltaX + deltaY * deltaY );
  }
} | 
           
         
     | 
 
      |  
       | I length bruger vi to 
        lokale variable, da det øger læsbarheden betydeligt, frem 
        for at have ét samlet udtryk. 
     | 
 
      |  
       | Endelig laver vi en testanvendelse, med opbygning af objektsystem og 
        klient: 
     | 
 
      |  
       |  
        
           
             
              public class Main {
  public static void main( String[] argv ) {
    // Opbygning af objektsystem
    Linie line = new Linie( new Punkt( 3, 0 ), new Punkt( 0, 4 ) );
    
    // Klient
    System.out.println( line.length() );
  }
} | 
           
         
     | 
 
      |  
       |  
        
           
       | 
 
      | 4 
       | Først laver vi klassen Bil, 
        der skal have en reference til en Motor 
        og en GearKasse. 
     | 
 
      |  
       |  
        
           
             
              public class Bil {
  private Motor motor;
  private GearKasse gearKasse;
  
  public Bil( int maxRPM, int stepRPM, int maxGear ) {
    motor = new Motor( maxRPM, stepRPM );
    gearKasse = new GearKasse( maxGear );
  }
  
  public void speedUp() {
    motor.up();
  }
  
  public void speedDown() {
    motor.down();
  }
  
  public void gearUp() {
    gearKasse.up();
  }
  
  public void gearDown() {
    gearKasse.down();
  }
  
  public double getSpeed() {
    return (double) ( motor.getRPM() * gearKasse.getGear() ) / 100;
  }
  
  public String toString() {
    return "[Bil:" + motor + gearKasse + "]";
  }
} | 
           
         
     | 
 
      |   
       | Dernæst følger klassen GearKasse 
        med en tilstand bestående af det gear som den er i, samt dens maksimale 
        gear. 
     | 
 
      |  
       |  
        
           
             
              public class GearKasse {
  private int gear;
  private int maxGear;
  
  public GearKasse( int maxGear ) {
    this.maxGear = maxGear;
    
    gear = 1; // starter altid i 1. gear
  }
  
  public void up() {
    if ( gear + 1 <= maxGear )
      gear++;
  }
  
  public void down() {
    if ( gear - 1 >= 1 )
      gear--;
  }
  
  public int getGear() {
    return gear;
  }
  
  public String toString() {
    return "[Gear=" + gear + "]";
  }
} | 
           
         
     | 
 
      |   
       | Klassen Motor har tre 
        instansvariable, som holder styr på nuværende RPM, det maksimale 
        RPM og i hvilke skridt RPM ændrer sig. 
     | 
 
      |  
       |  
        
           
             
              public class Motor {
  private int rpm;
  private int maxRPM;
  private int stepRPM;
  
  public Motor( int maxRPM, int stepRPM ) {
    this.maxRPM = maxRPM;
    this.stepRPM = stepRPM;
    rpm = 0;
  }
  
  public void up() {
    if ( rpm + stepRPM <= maxRPM )
      rpm += stepRPM;
  }
  
  public void down() {
    if ( rpm - stepRPM >= 0 )
      rpm -= stepRPM;
  }
  
  public int getRPM() {
    return rpm;
  }
  
  public String toString() {
    return "[RPM=" + rpm + "]";
  }
} | 
           
         
     | 
 
      |  
       | Endelig laver vi en testanvendelse, med opbygning af objektsystem og 
        klient: 
     | 
 
      |  
       |  
        
           
             
              public class Main {
  public static void main( String[] argv ) {
    // Opbygning af objektsystem
    Bil bil = new Bil( 3000, 250, 4 );
    
    // Klient
    System.out.println( bil.getSpeed() );
    
    for ( int i=0; i<10; i++ ) {
      for ( int j=0; j<10; j++ ) {
        bil.speedUp();
        System.out.println( bil.getSpeed() );
      }
      
      bil.gearUp();
    }
  }
}
 | 
           
         
     | 
 
      |  
       |  
        
           
             
              0.0
2.5
5.0
7.5
10.0
12.5
15.0
17.5
20.0
22.5
...
  | 
           
         
     | 
 
      |  
       | Udskriften er afkortet. 
     
            
       | 
 
      | 5 
       |  
        
           
             
              private Tidspunkt først( Tidspunkt t1, Tidspunkt t2 ) {
  if ( t1.compareTo( t2 ) < 0 )
    return t1;
  else
    return t2;
} | 
           
         
        
        
           
             
              private Tidspunkt sidst( Tidspunkt t1, Tidspunkt t2 ) {
  if ( t1.compareTo( t2 ) > 0 )
    return t1;
  else
    return t2;
} | 
           
         
          
         | 
 
      | 6 
       | Begge metoder bygger på en samme idé. Man kalder varighed 
        på de to instanser af Periode 
        som det drejer sig om: Os selv og den anden (givet ved parameteren 
        p).
     | 
 
      |  
       |  
        
           
             
              public boolean equals( Periode other ) {
  return varighed().equals( other.varighed() );
}
 | 
           
         
     | 
 
      |  
       |  
        
           
             
              public int compareTo( Periode other ) {
  return varighed().compareTo( other.varighed() );
}
 | 
           
         
     | 
 
      |  
       | Bemærk at kaldet af vores egen varighed 
        returnerer en reference til et Tidspunkt 
        og at vi sender et equals-, 
        henholdsvis compareTo-kald 
        via denne reference med det samme - i samme linie!
     | 
 
      |  
       |  |