호환되지 않는 인터페이스들을 연결하는 디자인 패턴
// Duck Package
public interface Duck {
public void quack();
public void fly();
}
public class MallardDuck implements Duck {
public void quack() {
System.out.println("꽥");
}
public void fly() {
System.out.println("날고 있어요!");
}
}
// Turkey Package
public interface Turkey {
public void gobble(); // 칠면조는 꽥꽥거리지 않습니다. 골골거리는 소리를 내요!
public void fly(); // 칠면조도 날 수 있긴 합니다. 멀리 날지는 못하지만요!
}
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("골골");
}
public void fly() {
System.out.println("짧은 거리를 날고 있어요!");
}
}
인터페이스가 달라서 Turkey 객체를 바로 사용할 수 없어, 어댑터를 만든다.
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.goggle();
}
public void fly() {
for(int i = 0; i < 3; i++) {
turkey.fly(); // 터키는 오리처럼 멀리 날지 못해요!
}
}
}
public class Main {
public static void main(String[] args) {
Duck duck = new MallardDuck();
Turkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("칠면조가 말하길");
turkey.gobble();
turkey.fly();
System.out.println("\n오리가 말하길");
testDuck(duck);
System.pout.println("\n칠면조 어댑터가 말하길");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
// 출력결과
칠면조가 말하길
골골
짧은 거리를 날고 있어요!
오리가 말하길
꽥
날고 있어요!
칠면조 어댑터가 말하길
골골
짧은 거리를 날고 있어요!
짧은 거리를 날고 있어요!
짧은 거리를 날고 있어요!
}
위의 예제와 같이 서로 관련이 없는 Turkey와 Duck 클래스를 Adapter를 구현해, 마치 동일한 객체인 것처럼 다룰 수 있게된다.
따라서, 어댑터 패턴을 사용하면, 다음과 같은 장점을 가질 수 있게 된다.