public interface Duck(){
public void quack();
public void fly();
}
public class MallardDuck implements Duck{
public void quack(){
System.out.println("Quack");
}
public void fly(){
System.out.println("I'm flying");
}
}
public interface Turkey{
public void gobble(); //칠면조는 꽥꽥거리지 않습니다. 골골거리는 소리를 내죠.
public void fly();
}
public class WildTurkey implements Turkey{
public void gobble(){
System.out.println("Gobble");
}
public void fly(){
System.out.println("I'm flying short distance");
}
}
public class TurkeyAdapter implements Duck{
Turkey turkey;
public TurkeyAdapter(Turkey turkey){
this.turkey = turkey;
}
public void quack(){
turkey.gobble();
}
public void fly(){
turkey.fly();
}
public class DuckTestDrive{
public static void main(String[] args){
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();
System.out.println("The Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\n The Duck says...");
testDuck(duck);
System.out.println("\n The TurkeyAdapter says...");
testDuck(turkeyAdapter);
static void testDuck(Duck duck){
duck.quack();
duck.fly();
}
}
어댑터 패턴의 정의 : 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.
이 패턴을 이용하면 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할 수 있다. 인터페이스를 변환해주는 어댑터를 만들면 되므로.. 이렇게 함으로써 클라이언트와 구현된 인터페이스를 분리시킬 수 있으며, 나중에 인터페이스가 바뀌더라도 그 변경 내역은 어댑터에 캡슐화되기 때문에 클라이언트는 바뀔 필요가 없다