어댑터 패턴(Adapter Pattern)
GoF 디자인 패턴 중 구조 패턴에 해당한다.
클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴이다.
호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.
안드로이드 개발 시 자주 보게 되는 패턴 중 하나이므로 개념 정리를 해보았다.
사용법
- 기존 클래스를 사용하고 싶은데 인터페이스가 맞지 않을 때
- 기존에 만들어 놓은 것을 재사용하고 싶은데 그것을 수정할 수 없을 때
구조
클래스 어댑터(Class Adapter)
- Adaptee는 변환이 필요하다.
- Adaptor가 Adaptee를 필요한 형태로 변환시켜주고 Client는 Adaptor를 통해 이를 사용한다.
- 자바의 상속을 이용한다.
객체 어댑터(Object Adapter)
- 객체 어댑터 패턴에서 Adapter는 Adaptee의 인스턴스를 가진다.
- 자바의 합성을 이용한다.
장점
- 관련성이 없는 인터페이스를 같이 사용할 수 있음
- 클래스 재사용성 증가
예제
클래스 다이어그램
패키지 구조
구현
USB B 타입을 C 타입으로 바꾸어주는 Adaptor를 구현한다. USB B 타입이 Adaptee가 된다.
package adaptee;
public class Usb {
private String type;
public Usb(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
package adaptee;
public class UsbTypeB {
public Usb getBType() {
return new Usb("B");
}
}
Adaptor를 interface로 구현해놓고 이를 Class Adaptor, Object Adaptor로 각각 구현해보았다.
package adapter;
import adaptee.Usb;
public interface BtoCAdapter {
public Usb getCType();
}
클래스 어댑터
package adapter;
import adaptee.Usb;
import adaptee.UsbTypeB;
public class BtoCClassAdapterImpl extends UsbTypeB implements BtoCAdapter{
@Override
public Usb getCType() {
return convertType(getBType(), "C");
}
private Usb convertType(Usb usb, String type){
usb.setType(type);
return usb;
}
}
객체 어댑터
package adapter;
import adaptee.Usb;
import adaptee.UsbTypeB;
public class BtoCObjectAdapterImpl implements BtoCAdapter {
private UsbTypeB usbTypeB;
public BtoCObjectAdapterImpl(UsbTypeB usbTypeB) {
this.usbTypeB = usbTypeB;
}
@Override
public Usb getCType() {
return convertType(usbTypeB.getBType(), "C");
}
private Usb convertType(Usb usb, String type){
usb.setType(type);
return usb;
}
}
import adaptee.UsbTypeB;
import adapter.BtoCAdapter;
import adapter.BtoCClassAdapterImpl;
import adapter.BtoCObjectAdapterImpl;
public class Client {
public static void main(String[] args) {
//Class Adapter
BtoCAdapter classAdapter = new BtoCClassAdapterImpl();
System.out.println("Current USB Type : "+classAdapter.getCType().getType());
//Object Adapter
UsbTypeB usbTypeB = new UsbTypeB();
System.out.println("Current USB Type : "+usbTypeB.getBType().getType());
BtoCAdapter objectAdapter = new BtoCObjectAdapterImpl(usbTypeB);
System.out.println("Current USB Type : "+objectAdapter.getCType().getType());
}
}
[실행 결과]
Current USB Type : C
Current USB Type : B
Current USB Type : C
소스 코드
REFERENCE
에릭 감마 외 3명, 「GoF의 디자인 패턴」, 피어슨에듀케이션코리아
어댑터 패턴
[구조 패턴] 어댑터 패턴(Adapter Pattern) 이해 및 예제