- 한 객체의 인터페이스를 다른 객체가 이해할 수 있도록 변환하는 특별한 객체
- 호환성 없는 인터페이스 때문에 함께 동작 못하는 클래스를 함께 할 수 있도록 변환 역할 해주는 행동 패턴
- 호환성
- 신규 기능 확장
- 대략 작동 과정
- 기존 객체 중 하나와 호환되는 인터페이스 받음
- 이 인터페이스 쓰면 기존 객체는 어댑터의 메서드들 안전히 호출 가능
- 호출을 수신하면 어댑터는 이 요청을 두 번째 객체에 해당 객체가 예상하는 형식과 순서대로 전달

객체 어댑터
- 객체 합성 원칙 사용

- 클라는 프로그램의 기존 비즈니스 로직 포함하는 클래스. 새로운 서비스 이용하려는 쪽. 클라 인터페이스(어댑터)를 통해 서비스 이용 가능하게 됨
- 클라 인터페이스는 다른 클래스들이 클라 코드와 공동 작업할 수 있도록 따라야 하는 프로토콜. 어댑터가 구현하는 인터페이스
- 어댑터는 클라와 Adaptee(Service) 중간에서 호환성이 없는 둘을 연결시켜주는 담당
- Object Adapter 방식에선 합성 이용
- Adaptee(Service)를 따로 클래스 멤버로 설정하고 위임 통해 동작 매치
- Adaptee(Service) 는 어댑터 대상 객체.
class Service{
void specificMethod(int specialDate){
System.out.println("기존 서비스 기능 호출 + " + specialDate);
}
}// Client Interface : 클라가 접근해서 사용할 고수준의 어댑터 모듈.
interface Target{
void method(int data);
}// Adapter : Adaptee 서비스를 클라이언트에서 사용하게 할 수 있도록 호환 처리 해주는 어댑터
class Adapter implements Target {
Service adaptee; // composition 으로 Service 객체를 클래스 필드로...
// 어댑터가 인스턴스화 되면 호환시킬 기존 서비스를 설정
Adapter(Service adaptee){
this.adaptee = adaptee;
}
// 어댑터 메서드가 호출되면, Adaptee의 메서드 호출하도록
public void method(int data){
adaptee.specificMethod(data) // 위임
}
}class Client{
public static void main(String[] args){
// 1. 어댑터 생성 (기존 서비스를 인자로 받아 호환 작업 처리)
Target adapter = new Adapter(new Service());
// 2. Client Interface의 스펙(Target의미 하는것!)에 따라 메서드 실행하면 기존 서비스의 메서드가 실행됨
adapter.method(1);
}
}클래스 어댑터
- 상속 사용

// Adaptee : 클라이언트에서 사용하고 싶은 기존의 서비스 (하지만 호환이 안되서 바로 사용 불가능)
class Service{
void specificMethod(int specialDate){
System.out.println("기존 서비스 기능 호출 + " + specialDate);
}
}// Client Interface : 클라이언트가 접근해서 사용할 고수준의 어댑터 모듈
interface Target {
void method(int data);
}// Adapter
class Adapter extends Service implements Target {
public void method(int data){
specificMethod(data);
}
}class Client{
public staic void main(String[] args) {
Target adapter = new Adapter();
adapter.method(1);
}
}실예제
String[] arr = {"a", "b", "c"};
List<String> list = Arrays.asList(arr); // 배열 → List 변환 (어댑터)Arrays.asList() 는 배열과 리스트라는 호환되지 않는 두 타입의 인터페이스를 연결해주기 때문에 어댑터 패턴의 대표적인 예시