어댑터를 번역하면 변환기라고 할 수 있다. 변환기의 역할은 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것이다.
데이터베이스 관련 프로그램을 작성해 본 경험이 있다면 다양한 데이터베이스 시스템을 공통의 인터페이스인 ODBC 또는 JDBC를 이용해 조작할 수 있다는 사실을 알고 있을 것이다. 이러한 ODBC, JDBC가 어댑터 패턴을 이용해 다양한 데이터베이스 시스템을 단일한 인터페이스로 조작할 수 있게 해주기 때문이다. 자바 언어의 플랫폼별 JRE 또한 어댑터 패턴이다.
JDBC와 JRE는 OCP의 예시 중 하나이다. 결국 어댑터 패턴은 개방 폐쇄 원칙을 활용한 설계 패턴이라고도 할 수 있다. JDBC와 JRE가 어댑터의 역할을 수행하고 있는 것이다.
public class ServiceA {
void runServiceA(){
System.out.println("ServiceA");
}
}
public class ServiceB {
void runServiceB(){
System.out.println("ServiceB");
}
}
public class ClientWithNoAdapter {
public static void main(String[] args){
ServiceA sa1 = new ServiceA();
ServiceB sa2 = new ServiceB();
sa1.runServiceA();
sa2.runServiceB();
}
}
public class AdapterServiceA implements AdapterInterface {
ServiceA sa1 = new ServiceA();
void runService(){
sa1.runServiceA();
}
}
public class AdapterServiceB implements AdapterInterface {
ServiceA sa1 = new ServiceA();
void runService(){
sa1.runServiceA();
}
}
interface AdapterInterface {
void runService();
}
public class ClientWithAdapter {
public static void main(String[] args){
AdapterInterface asa1 = new AdapterServiceA();
AdapterInterface asa2 = new AdapterServiceB();
asa1.runService();
asa2.runService();
}
}
기존의 ServiceA와 ServiceB의 메서드를 runService()라고 하는 같은 이름의 메서드로 호출해서 사용할 수 있다.
어댑터 패턴은 합성(객체를 속성으로 만들어 참조)하는 디자인 패턴으로, 당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 통해 호출하는 패턴이다.