어댑터 패턴이란, 이름에서 볼 수 있듯이 일반적인 방법으로는 사용하지 못하는 서비스에 대해서 어댑터 라는 객체를 만들어서 클라이언트가 서비스를 사용할 수 있게끔 해주는 구조 패턴
110V 가전제품을 220V 어댑터를 통해서 사용하는 개념
즉, 호환성이 없는 인터페이스 때문에 동작할 수 없는 클래스들을 함께 작동 할 수 있도록 변환
어댑터 패턴에는 두가지 구조가 있다
사용할 수 없는 adaptee 클래스를 사용하기위해서 Adapter 클래스가 adaptee를 합성하여 사용할 수 있게하고 사용자는 Adapter 클래스를 사용하므로 adaptee를 사용할 수 있게된다.
// Adaptee : 클라이언트에서 사용하고 싶은 기존의 서비스 (하지만 호환이 안되서 바로 사용 불가능)
class Service {
void specificMethod(int specialData) {
System.out.println("기존 서비스 기능 호출 + " + specialData);
}
}
// 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 Interfac의 스펙에 따라 메소드를 실행하면 기존 서비스의 메소드가 실행된다.
adapter.method(1);
}
}
Target 인터페이스를 통해서 어댑터를 정의해주었고 이 어탭터 클래스가 Service 클래스를 상속받아서 service의 내부 기능을 사용할 수 있게 설정
클라이언트는 어댑터 클래스를 통해서 service의 내부 기능을 사용
Client에서 접근할 수 없던 Service 클래스를 사용하기 위해서 Adpater 클래스를 만들어주고 Adapter클래스가 Service 클래스를 상속받도록 설계하고, 인터페이스를 통해 해당 Service를 접근할 수 있도록 Target 인터페이스를 생성합니다.
해당 Target 인터페이스의 메서드를 정의하는 과정에서 Service의 함수를 사용할 수 있도록 설정
// Adaptee : 클라이언트에서 사용하고 싶은 기존의 서비스 (하지만 호환이 안되서 바로 사용 불가능)
class Service {
void specificMethod(int specialData) {
System.out.println("기존 서비스 기능 호출 + " + specialData);
}
}
// Client Interface : 클라이언트가 접근해서 사용할 고수준의 어댑터 모듈
interface Target {
void method(int data);
}
// Adapter : Adaptee 서비스를 클라이언트에서 사용하게 할 수 있도록 호환 처리 해주는 어댑터
class Adapter extends Service implements Target {
// 어댑터의 메소드가 호출되면, 부모 클래스 Adaptee의 메소드를 호출
public void method(int data) {
specificMethod(data);
}
}
class Client {
public static void main(String[] args) {
// 1. 어댑터 생성
Target adapter = new Adapter();
// 2. 인터페이스의 스펙에 따라 메소드를 실행하면 기존 서비스의 메소드가 실행된다.
adapter.method(1);
}
}