사용 의도
- 클래스의 인터페이스를 사용자가 기대하는 인터페이스로 적응시킵니다.
구조
- 합성을 이용한 패턴과, 상속을 이용한 패턴 2가지 Adapter Pattern 이 있습니다.
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/
'디자인패턴' 카테고리의 다른 글
복합체 패턴 (Composite Pattern) (0) | 2021.06.19 |
---|---|
브릿지 패턴 (Bridge Pattern) (0) | 2021.06.18 |
단일체 패턴 (Singleton Pattern) (0) | 2021.06.05 |
원형패턴 (Prototype Pattern) (0) | 2021.06.03 |
팩토리 메서드 패턴 (Factory Method Pattern) (0) | 2021.05.29 |