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

객체 어댑터

  • 객체 합성 원칙 사용
  1. 클라는 프로그램의 기존 비즈니스 로직 포함하는 클래스. 새로운 서비스 이용하려는 쪽. 클라 인터페이스(어댑터)를 통해 서비스 이용 가능하게 됨
  2. 클라 인터페이스는 다른 클래스들이 클라 코드와 공동 작업할 수 있도록 따라야 하는 프로토콜. 어댑터가 구현하는 인터페이스
  3. 어댑터는 클라와 Adaptee(Service) 중간에서 호환성이 없는 둘을 연결시켜주는 담당
    • Object Adapter 방식에선 합성 이용
    • Adaptee(Service)를 따로 클래스 멤버로 설정하고 위임 통해 동작 매치
  4. 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() 는 배열과 리스트라는 호환되지 않는 두 타입의 인터페이스를 연결해주기 때문에 어댑터 패턴의 대표적인 예시