어댑터를 번역하면 변환기라 할 수 있다. 변환기 역할은 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것이다. 예를 들면 충전기가 대표적인 변환기이다. 휴대폰을 직접 전원 콘센트에 연결할 수 없으므로 충전기가 핸드폰과 전원 콘센트 사이에서 둘을 연결해주는 변환기 역할을 수행한다. 따라서 어댑터 패턴은 호환되지 않는 인터페이스를 가진 객체들이 협업할 수 있도록 하는 구조적 디자인 패턴이다.
둥근 구멍들에 정사각형 못들을 맞추는 예제이다. 호환되지 않는 객체들이 어댑터를 활용해 서로 협업할 수 있도록 하는지 보여준다.
public class RoundHole {
private double radius;
public RoundHole(double radius){
this.radius = radius;
}
public double getRadius(){
return radius;
}
public boolean fits(RoundPeg peg){
boolean result;
result = (this.getRadius() >= peg.getRadius());
return result;
}
}
public class RoundPeg{
private double radius;
public RoundPeg(){}
public RoundPeg(double radius){
this.radius = radius;
}
public double getRadius(){
return radius;
}
}
public class SquarePeg {
private double width;
public SquarePeg(double width){
this.width = width;
}
public double getWidth(){
return width;
}
public double getSquare(){
double result;
result = Math.pow(this.width, 2);
return result;
}
}
// Adapter allows fitting square pegs into round holes.
public class SquarePegAdapter extends RoundPeg{
private SquarePeg peg;
public SquarePegAdapter(SquarePeg peg){
this.peg = peg;
}
@Override
public double getRadius(){
double result;
// Calculate a minimum circle radius, which can fit this peg
result = (Math.sqrt(Math.pow((peg.getWidth() / 2), 2) * 2));
return result;
}
}
public class Demo {
public static void main(String[] args) {
// Round fits round, no surprise
RoundHole hole = new RoundHole(5);
RoundPeg rpeg = new RoundPeg(5);
if(hole.fits(rpeg)){
System.out.println("Round peg r5 fits round hole r5.");
}
SquarePeg smallSqPeg =new SquarePeg(2);
SquarePeg largeSqPeg = new SquarePeg(20);
// hole.fits(smallSqPeg); Won't compile.
// Adapter solves the problem
SquarePegAdapter smallSqPegAdapter = new SquarePegAdapter(smallSqPeg);
SquarePegAdapter largeSqPegAdapter = new SquarePegAdapter(largeSqPeg);
if(hole.fits(smallSqPegAdapter)){
System.out.println("Square peg w2 fits round hole r5.");
}
if(!hole.fits(largeSqPegAdapter)){
System.out.println("Square w20 does not fit into round hole r5.");
}
}
}
Round peg r5 fits round hole r5.
Square peg w2 fits round hole r5.
Square w20 does not fit into round hole r5.
어댑터를 사용해 정사각형 못을 정사각형 지름의 절반을 반지름으로 가진 둥근 못인 척 한다.
디자인 패턴에 뛰어들기
스프링 입문을 위한 자바 객체 지향의 원리와 이해