1. 개요

이 빠른 사용방법(예제)에서는 어댑터 패턴과 해당 Java 구현을 살펴보겠습니다.

2. 어댑터 패턴

어댑터 패턴은 직접 연결할 수 없는 두 개의 호환되지 않는 인터페이스 간의 커넥터 역할을 합니다. 어댑터는 클라이언트의 인터페이스와 호환되도록 기존 클래스를 새 인터페이스로 래핑합니다.

이 패턴을 사용하는 주된 동기는 기존 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 변환하는 것입니다. 일반적으로 애플리케이션이 디자인되면 구현됩니다.

2.1. 어댑터 패턴 예

고급 자동차의 최고 속도를 시속 마일(MPH) 단위로 반환하는 앱이 미국에서 개발된 시나리오를 생각해 보세요. 이제 동일한 결과를 원하지만 시간당 킬로미터(km/h)를 원하는 영국 고객을 위해 동일한 앱을 사용해야 합니다.

이 문제를 해결하기 위해 값을 변환하고 원하는 결과를 제공하는 어댑터를 만듭니다.

RPT ER5p

먼저 일부 고급 자동차의 속도를 시간당 마일로 반환하는 원래 인터페이스 Movable을 만듭니다 .

public interface Movable {
    // returns speed in MPH 
    double getSpeed();
}

이제 이 인터페이스의 구체적인 구현을 하나 만들겠습니다.

public class BugattiVeyron implements Movable {
 
    @Override
    public double getSpeed() {
        return 268;
    }
}

이제 동일한 Movable 클래스를 기반으로 하는 어댑터 인터페이스 MovableAdapter를 생성합니다 . 다른 시나리오에서 다른 결과를 생성하도록 약간 수정될 수 있습니다.

public interface MovableAdapter {
    // returns speed in KM/H 
    double getSpeed();
}

이 인터페이스의 구현은 변환에 사용될 전용 메서드 convertMPHtoKMPH() 로 구성됩니다 .

public class MovableAdapterImpl implements MovableAdapter {
    private Movable luxuryCars;
    
    // standard constructors

    @Override
    public double getSpeed() {
        return convertMPHtoKMPH(luxuryCars.getSpeed());
    }
    
    private double convertMPHtoKMPH(double mph) {
        return mph * 1.60934;
    }
}

이제 어댑터에 정의된 메서드만 사용하고 변환된 속도를 얻습니다. 이 경우 다음 어설션이 참이 됩니다.

@Test
public void whenConvertingMPHToKMPH_thenSuccessfullyConverted() {
    Movable bugattiVeyron = new BugattiVeyron();
    MovableAdapter bugattiVeyronAdapter = new MovableAdapterImpl(bugattiVeyron);
 
    assertEquals(bugattiVeyronAdapter.getSpeed(), 431.30312, 0.00001);
}

여기서 알 수 있듯이 어댑터는 이 특별한 경우에 대해 268mph를 431km/h 로 변환합니다.

2.2. 어댑터 패턴을 사용하는 경우

  • 외부 구성 요소가 우리가 재사용하고 싶은 매력적인 기능을 제공하지만 현재 응용 프로그램과 호환되지 않는 경우 . 서로 호환되도록 적절한 어댑터를 개발할 수 있습니다.
  • 애플리케이션이 클라이언트가 기대하는 인터페이스와 호환되지 않는 경우
  • 원본 코드를 수정하지 않고 애플리케이션에서 레거시 코드를 재사용하려는 경우

3. 결론

이 기사에서는 Java의 어댑터 디자인 패턴을 살펴보았습니다.

이 예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .

Generic footer banner