본문 바로가기
디자인패턴

어댑터 패턴 (Adapter pattern)

by 이석준석이 2021. 6. 12.

사용 의도

  • 클래스의 인터페이스를 사용자가 기대하는 인터페이스로 적응시킵니다.

구조

  • 합성을 이용한 패턴과, 상속을 이용한 패턴 2가지 Adapter Pattern 이 있습니다.

Adapter pattern (Composition)
Adapter Pattern (Inheritance)

GOF pattern 설명
Client 외부 Library 를 사용하려는 클라이언트이다.
Target Adapter 가 구현하는 인터페이스거나 혹은 상속하는 클래스
Adapter RestTemplate 의 기능을 사용하여 사용자가 기대하는 인터페이스로 변환해주는 Adapter
Adaptee 외부 Library

UserAdaptee 로 외부에 호출하여 유저의 정보를 가져온 뒤

  • 유저의 등급을 VIP 로 작업해야 하는 경우
작업 수행 주체
외부에서 유저의 정보를 가져오는 작업 UserAdaptee
유저에게 VIP 등급을 부여하는 작업 VIPAdapter

 

UserAdaptee 를 다른 클래스에서 사용하고 있을 수 있으므로, 또한 UserAdaptee 클래스가 외부 라이브러리라면

  • 해당 클래스에서 Response 에 대해 VIP 등급을 부여하는 작업을 수행할 수 없습니다.
  • 따라서 Adapter 를 한개 생성하여 VIP 등급을 부여할 수 있도록 합니다.

public class UserAdaptee {
    public UserDto getUserInfo() {
        final UserDto userDto =
                new RestTemplate().getForObject("http://robin00q.tistory.com", UserDto.class);
        return userDto;
    }
}
public interface WebTarget {
    UserDto getUserInfo();
}
@AllArgsConstructor
public class VIPAdapter implements WebTarget {
    private UserAdaptee userAdaptee;

    public UserDto getUserInfo() {
        final UserDto userDto = userAdaptee.getUserInfo();
        userDto.setGrade("VIP");

        return userDto;
    }
}
@Setter
public class WebClient {
    private WebTarget webTarget;

    public UserDto getUser() {
        return webTarget.getUserInfo();
    }
}
public class Main {
    public static void main(String[] args) {
        WebClient webClient = new WebClient();
        webClient.setWebTarget(new VIPAdapter(new UserAdaptee()));

        final UserDto user = webClient.getUser();
    }
}

참고 : https://yaboong.github.io/design-pattern/2018/10/15/adapter-pattern/