Adapter패턴은 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용할 수 있도록 해줍니다. 따라서 SOLID원칙인 개방 폐쇄 원칙을 따릅니다. 실생활에서 예시를 들면 변환 젠더나 충전 케이블 같이 서로 호환이 안되지만 usb-c타입에서 hdmi로 변경해주거나, usb-c타입에서 usb-A타입으로 변환해주는 것과 같습니다.
위의 예시와 비슷하게 기존에 쓰던 코드 및 라이브러리를 필수적으로 변경해야 하는 경우 외부에 영향을 미치지 않을 수 없습니다. 기존의 것을 최대한 변경하지 않고 구현할 수 있어야 합니다. Adapter 패턴을 사용하게 되면 기존 코드를 변경하지 않아도 되는 장점과 변경하지 않아도 되기 때문에 재활용성도 증가시킬 수 있습니다.
기존 클래스를 감싼 새로운 클래스를 생성하고 인터페이스를 재구성하기 때문에 많은 사람들이 이용하는 프로그램에는 Adapter를 자주 볼 수 있습니다. RecyclerViewAdapter, ListAdpater 등등
공통적으로 어댑터는 추가 코드가 많이 필요하다. 즉, 복잡도가 증가하며 속도가 저하된다. 어댑터에 기능을 추가하는거 보다 기존 코드의 인터페이스를 수정하는 것도 좋은 선택이 될 수도 있다.
Adapter
interface Type8 {
public void connect();
}
interface TypeC {
public void connect();
}
구현
class Galaxy implements TypeC {
@Override
public void connect() {
System.out.println("Type C 연결됨");
}
}
class IPhone implements Type8 {
@Override
public void connect() {
System.out.println("Type 8 연결됨");
}
}
public class Main {
public static void main(String[] args) {
Galaxy galaxy = new Galaxy();
IPhone iPhone = new IPhone();
typeC_connect(galaxy);
type8_connect(iPhone);
Type8toTypeCAdapter adapter = new Type8toTypeCAdapter(iPhone);
typeC_connect(adapter);
}
static void typeC_connect(TypeC typeC) {
typeC.connect();
}
static void type8_connect(Type8 type8) {
type8.connect();
}
}
실행결과
Type C 연결됨
Type 8 연결됨
Type 8 연결됨