본문 바로가기
아키텍처/디자인 패턴

2. Adapter Pattern

by doflamingo 2020. 12. 10.

어댑터 패턴은  어떤 클래스의 인터페이스를 사용하고자 하는 다른 인터페이스로 변환한다.

다시 말해서 어댑터는 클라이언트의 인터페이스와 호환되도록 기존 클래스를 새 인터페이스로 래핑한다.

 

우리가 사용하는 콘센트 변경 어댑터라고 생각하면 된다. 

 

어댑터 패턴 구조

client는 Moveable 클래스를 사용하고 싶은데 Moveable 클래스의 getSpeed()는 마일로 속도를 반환해주기 때문에 한국에서는 쓰기 유용하지 않다.

그래서 Movable 클래스를 건드리지 않고 MovableAdapter라는 인터페이스를 이용해서 마일로 되어있는 속도를 Km로 변환해서 사용하는 방법이다. 

 

예를 통해서 확인해보자

 

기존 Movable이 있다. 

public interface Movable {
  float getSpeed();
}

이걸 구현한 Benz라는 클래스가 있다. 

public class Benz implements Movable{
  //속도를 마일로 리턴
  @Override
  public float getSpeed() {
    return 230f;
  }
}

 

그러나 한국에서는 속도를 마일로 사용하지 않고 km/h로 사용하기 때문에 직접 사용하지 못한다. 그러나 Movable을 변경하는 것은 다른데 서 또 사용할 수도 있기 때문에 변경하지 않고 Adapter라는 클래스를 통해 변환한다. 

public interface MovableAdapter {
  float getSpeed();
}
public class KoreanCar implements MovableAdapter{
  private Movable koreanCar;

  public KoreanCar(Movable car) {
    koreanCar = car;
  }

  @Override
  public float getSpeed() {
    return koreanCar.getSpeed()*1.6f;
  }
}

 

이렇게 Movable을 생성자로 받고 변경해서 마일 속도에 1.6을 곱해서 사용할 수 있다.

public class Main {
  public static void main(String[] args) {
    Movable benz = new Benz();
    MovableAdapter koreanBenz = new KoreanCar(benz);
    System.out.println(benz.getSpeed());
    System.out.println(koreanBenz.getSpeed());

  }
}

결과 값

이런식으로 사용하게 되면 기존 클래스를 변경하지 않고 재사용하면서 원하는 기능을 추가 변경할 수 있다.

 

Adapter Pattern를 사용하는 경우

- 외부 구성 요소가 재사용하고 싶은 기능을 제공하지만 현재 애플리케이션과 호환되지 않는 경우 서로 호환되도록 적합한 어댑터를 개발할 수 있다.

- 애플리케이션이 클라이언트가 기대하는 인터페이스와 호환되지 않는 경우

- 원래 코드를 수정하지 않고 애플리케이션에서 레거시 코드를 재사용하려는 경우

 

 

코드

 

- 출처 - 

gdtbgl93.tistory.com/141

www.baeldung.com/java-adapter-pattern

'아키텍처 > 디자인 패턴' 카테고리의 다른 글

5. Singleton Pattern  (0) 2020.12.13
4. Factory Method Pattern  (0) 2020.12.13
3. Template Method Pattern  (0) 2020.12.13
1. Strategy Pattern  (0) 2020.12.09

댓글