[Design Pattern] Adapter Pattern
02 Feb 2018Adapter Pattern
클라이언트가 요구하는 인터페이스와 재사용하려는 모듈의 인터페이스가 일치하지 않는 경우 사용할 수 있다.
예시 상황
통합 검색 기능을 구현하기 위해 SearchService 인터페이스를 작성하고, DB를 이용한 DBSearchService 클래스를 구현하였다. 검색 속도의 문제가 발생하여 Tolr라는 오픈 소스 검색 서버를 도입하기로 하였고 TolrClient라는 모듈을 사용해서 Tolr와 연동할 수 있다.
통합 검색 기능을 정의한 SearchService 인터페이스
TolrClient가 제공하는 인터페이스와 SearchService 인터페이스가 맞지 않다.
어댑터 패턴을 적용한 구조
어댑터에 해당하는 SearchServiceTolrAdapter 클래스는 TolrClient를 SearchService 인터페이스에 맞춰 주는 책임을 갖는다.
public class SearchServiceTolrAdapter implements SearchService {
private TolrClient tolrClient = new TolrClient();
public SearchResult search(String keyword) {
TolrQuery tolrQuery = new TolrQuery(keyword);
QueryResponse response = tolrClient.query(tolrQuery);
// TolrClient의 결과를 SearchResult로 변환
SearchResult searchResult = convertToResult(response);
return searchResult;
}
}
SearchServiceTolrAdapter는 SearchService를 구현하고 있으므로 WebSearchRequestHandler 클래스의 수정 없이 TolrClient를 이용한 검색으로 구현을 변경할 수 있다.