본문 바로가기

디자인 패턴

디자인 패턴 - 어댑터 패턴(Adapter Pattern)

1. 정의

  • 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 타깃을 구현하여 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 한다.

2. 예시

  • 어댑터를 사용하여 오리에게 “꽥”소리가 아닌 “골골”소리를 내게 한다.

3. 그림

4. 클래스 다이어그램

5. 코드

public class Client {
    public static void main(String[] args){

        Duck mallard = new MallardDuck();
        mallard.quack();
        
        Turkey turkey = new WildTurkey();
        Duck duck = new TurkeyAdapter(turkey);
        duck.quack();
    }
}
/* 출력
꽥
골골
*/
public interface Duck {
    void quack();
}
public interface Turkey {
    void gobble();
}
public class MallardDuck implements Duck{
    @Override
    public void quack() {
        System.out.println("꽥");
    }
}
public class WildTurkey implements Turkey{
    @Override
    public void gobble() {
        System.out.println("골골");
    }
}
// 타깃 구현
public class TurkeyAdapter implements Duck{

    Turkey turkey;

    public TurkeyAdapter(Turkey turkey) {
        this.turkey = turkey;
    }

    // 요청 변환
    @Override
    public void quack() {
        turkey.gobble();
    }
}

https://github.com/kang-seongbeom/design_pattern

💡 Github에서 디자인 패턴 코드를 볼 수 있습니다.

6. 설명

  • Client는 오리밖에 못썼지만, 어댑터를 통해 칠면조까지 쓸 수 있게 되었다.
  • TurckeyAdapter는 타깃인 Duck을 구현한다.
  • Client는 타깃 인터페이스인 Duck의 quack()을 요청한다.
  • TurkeyAdapter는 요청을 gobble()로 요청을 변환한다.
  • 결국, Client는 Duck 참조변수로 어댑터만 주입받으면 어댑터의 존재를 모를 수 있는 구조다.