본문 바로가기

Design/Design Pattern

[Design Pattern] Adapter Pattern

이번 장에서는 어댑터(Adapter) 패턴에 대해서 알아보도록 한다.
샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다.


필자는 모든 디자인 패턴을 우리 일상 생활에 접목시켜서 알아보려한다.
이번 어댑터 패턴은 "오프라인 화장품 매장"에 접목시켜 알아보겠다.

어댑터 패턴이란?

호환되지 않는 인터페이스를 클라이언트는 코드 변경없이 그대로 활용할 수 있다.
클라이언트가 사용하려는 인터페이스가 자신이 사용하는 방식과 맞지 않더라도 어댑터를 이용하여 사용할 수 있게 되는 것이다.

GoF Design Patterns에 따르면 아래와 같은 Class Diagram이 그려진다.

"오프라인 화장품 매장"에 접목시켜보면 아래와 같은 Class Diagram이 그려진다.

화장품을 구매하려는 고객(Customer)이 있고 오프라인 화장품 매장(OfflineCosmeticsStore)이 있다.
고객의 니즈는 내가 상품을 주문하였을 때 상품이 집 앞까지 배달되고 반품할 때 또한 매장까지 배달되기를 원한다.
하지만 오프라인 화장품 매장은 오프라인 결제만 가능하여 order, returns 기능만 지원하고 있어서 고객의 니즈를 충족시키지 못하고 있다.

이러한 둘 사이의 호환성을 맞춰주기 위하여 배달 서비스(DeliveryCompany, Adapter)의 구현체인 CJ택배(CJDeliveryCompany, Adaptee)가 등장한다.
고객은 CJ택배를 통해 주문을 하면 자신이 원하는 대로 화장품을 집 앞까지 배달받을 수도 반품을 할 수도 있게 되는 것이다.

여기서 중요한 것은 Customer가 원한다고 해서 OfflineCosmeticsStore의 코드가 변경되지 않았다는 점이다.
Customer또한 로직의 변경없이 OfflineCosmeticsStore 대신 CJDeliveryCompany만 사용하도록 변경해주면 된다.


오프라인 화장품 매장은 Lotion과 Perfume을 판매하며 판매 메소드인 order와 반품 메소드인 returns를 가지고 있다.

OfflineCosmeticsStore

배달 업체 인터페이스는 주문과 배달 (orderAndDelivery) 메소드와 반품과 배달 (returnsAndDelivery)를 가지고 있다.

DeliveryCompany

배달 업체 인터페이스를 구현하는 CJ택배는 orderAndDelivery 메소드와 returnsAndDelivery 메소드를 구현하고 있다.

CJDeliveryCompany

고객이 상품을 받고 반품하는 코드는 아래와 같다.

Customer

코드를 실행하면 결과는 아래와 같다.


지금까지

  • 집에서 상품을 받아보고 싶은 고객과
  • 매장에서만 상품을 판매하고 싶은 판매자간의
  • 호환을 맞쳐주는 배달업체를

예시로 들어 어댑터 패턴에 대해서 알아보았다.