// 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