프로그래밍/DesignPattern

어댑터 패턴

모지사바하 2007. 7. 25. 14:24

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();
  }
}

어댑터 패턴의 정의 : 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환합니다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있습니다.

이 패턴을 이용하면 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용할 수 있다. 인터페이스를 변환해주는 어댑터를 만들면 되므로.. 이렇게 함으로써 클라이언트와 구현된 인터페이스를 분리시킬 수 있으며, 나중에 인터페이스가 바뀌더라도 그 변경 내역은 어댑터에 캡슐화되기 때문에 클라이언트는 바뀔 필요가 없다