アダプタモードアダプタ
2314 ワード
//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());
}
}
}
public 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);
}
}
}