Adapter Pattern 기본

Updated:

Adapter Pattern


용도 :

  • 다른곳에서 개발한것을 바로 사용을 할수 없는 경우,
  • 그때 중간에 adapter역할을 해주는 (convert라고 봐도 된다.)
  • 클래스를 만들어서 다른곳에서 개발한것도 사용할수 있게 해주기 위함
  • 현재 있는 클라이언트는 그대로 사용이 가능함
  • 향후 클라이언트가 가리키는 인터페이스가 바뀌더라도, 실질적인 변경 내용은 Adapter 클래스에 있으니 상관이 없음



Adapter



여기서

  • Adapter는 TurkeyAdapter 클래스,
  • Adaptee는 WildTurkey일것이고
  • Target Interface는 기존 원래의 Duck 클래스를 의미한다.

상황은 기존에 쓰던 Duck쪽이 아니라 , Turkey쪽을 가리키고 싶은데, 클라이언트는 여전히 Duck 인터페이스를 가리키게 해야 하는 상황이다.

  • 그러므로, Duck Interface를 implement하는 Adapter를 만든 후에,
  • Turkey Interface를 구체화하는 WildTurkey class의 메소드로 가리키게 만들면 된다.

그래서 Adapter에는 Turkey 인터페이스가 들어가게 되어있고, 구현체는 실제적으로 구현이 되어야할 class가 자리잡게 된다.

코드를 보는것이 더빠를것이다.

public static void main(String[] args) throws IOException {
        MallardDuck duck = new MallardDuck();
        WildTurkey turkey = new WildTurkey();
        Duck turkeyAdapter = new TurkeyAdapter(turkey); // turkey는 WildTurkey class를 가리킴
        System.out.println("The Duck Says..");
        testDuck(duck);

        System.out.println("The TurkeyAdapter Says...");
        testDuck(turkeyAdapter); // 실제로는 

    }
    public static void testDuck(Duck duck) {
        duck.quack();
        duck.fly();
    }
public interface Duck {
    void quack();
    void fly();
}
public interface Turkey {
    void gobble();
    void fly();
}
public class MallardDuck implements Duck{
    @Override
    public void quack() {
        System.out.println("Quack");
    }

    @Override
    public void fly() {
        System.out.println("I'm flying");
    }
}
public class WildTurkey implements Turkey{
    @Override
    public void gobble() {
        System.out.println("Gobble Gobble");
    }

    @Override
    public void fly() {
        System.out.println("I'm flying a short distance");
    }
}
public class TurkeyAdapter implements Duck {
    Turkey turkey; 
    public TurkeyAdapter(Turkey turkey) { // TurkeyAdapter에 turkey 주입
        this.turkey = turkey;
    }
    @Override
    public void quack() {
        turkey.gobble();
    }

    @Override
    public void fly() {
        turkey.fly();
    }
}



위의 방법은 객체 adapter 방식이라고 한다.

  • Target(interface)을 바라보고, Adapter는 Target을 implement한다
  • Adapter는 Adaptee와 직접 연관이 되고, Adaptee의 method를 호출한다.

참고 : https://jusungpark.tistory.com/22

Leave a comment