어댑터 패턴

인터페이스가 맞지 않는 기존 객체(어댑티)를, 클라이언트가 기대하는 인터페이스로 변환해 사용하게 하는 패턴

  • 어떤 인터페이스를 클라이언트에서 요구하는 형태로 변환시키는 중개인 역할

  • 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 수정하지 않고도 사용할수 있게해줌

  • 어댑터는 타깃 인터페이스를 구현하고 내부에 어댑티(adaptee) 인스턴스가 포함되어 있음

    • 어댑티(adaptee): 현재 클라이언트가 기대하는 인터페이스와 맞지 않는 대상 객체

    • 모든 요청은 어댑티에 위임됨

  • 어댑터 구현은 타깃 인터페이스로 지원해야하는 인터페이스 크기의 비례해서 복잡해짐

    • 어댑터는 클라이언트에서 호출하는 많은 부분을 새로운 인터페이스에 맞춰서 고치는 대신 모든 변경 사항을 캡슐화할 클래스 하나만 제공하는 방법

  • 어댑티를 새로 바뀐 인터페이스로 감쌀 때는 객체 구성(composition)을 사용

    • 이런 접근법은 어댑티의 모든 서브클래스에 어댑터를 쓸수 있는 장점이 있음

어댑티가 지원하지 않는 기능이 타깃 인터페이스에 있다면?

  • 어댑티가 지원하지 않는 기능은 숨기지 말고, 실패·분리·조합 중 하나로 명시적으로 처리해야 함 👉 어댑터는 “차이 보정”이지 “기능 창조”가 아님


1. Target 인터페이스

클라이언트가 기대하는 인터페이스

interface Logger {
  log(message: string): void
}

2. Adaptee 클래스

기대하는 인터페이스와 일치하지 않는 기존 구현체

3. Adapter 클래스

인터페이스 변환 역할

4. 클라이언트 코드

Last updated