// Purpose.  Adapter design pattern
// 1. Identify the desired interface
// 2. Design a "wrapper" class that can "impedance match" the old to the new
// 3. The adapter/wrapper class "has a" instance of the legacy class
// 4. The adapter/wrapper class "maps" (or delegates) to the legacy object
// 5. The client uses (is coupled to) the new interface
class SquarePeg {                     /*** The OLD ***/
   private double width;
   public SquarePeg( double w )       { width = w; }
   public double getWidth()           { return width; }
   public void   setWidth( double w ) { width = w; }
}
class RoundHole {                     /*** The NEW ***/
   private int radius;
   public RoundHole( int r ) {
      radius = r;
      System.out.println( "RoundHole: max SquarePeg is " + r * Math.sqrt(2) );
   }
   public int getRadius() { return radius; }
}
// 2. Design a "wrapper" class that can "impedance match" the old to the new
class SquarePegAdapter {
   // 3. The adapter/wrapper class "has a" instance of the legacy class
   private SquarePeg sp;
   public SquarePegAdapter( double w ) { sp = new SquarePeg( w ); }
   // 1. Identify the desired interface
   public void makeFit( RoundHole rh ) {
      // 4. The adapter/wrapper class delegates to the legacy object
      double amount = sp.getWidth() - rh.getRadius() * Math.sqrt(2);
      System.out.println( "reducing SquarePeg " + sp.getWidth() + " by "
         + ((amount < 0) ? 0 : amount) + " amount" );
      if (amount > 0) {
         sp.setWidth( sp.getWidth() - amount );
         System.out.println( "   width is now " + sp.getWidth() );
}  }  }
class AdapterDemoSquarePeg {
   public static void main( String[] args ) {
      RoundHole        rh = new RoundHole( 5 );
      SquarePegAdapter spa;
      for (int i=6; i < 10; i++) {
         spa = new SquarePegAdapter( (double) i );
         // 5. The client uses (is coupled to) the new interface
         spa.makeFit( rh );
}  }  }
// RoundHole: max SquarePeg is 7.0710678118
// reducing SquarePeg 6.0 by 0.0 amount
// reducing SquarePeg 7.0 by 0.0 amount
// reducing SquarePeg 8.0 by 0.9289321881345245 amount
//    width is now 7.0710678118654755
// reducing SquarePeg 9.0 by 1.9289321881345245 amount
//    width is now 7.0710678118654755