인터페이스가 서로 맞지 않을 때 함께 동작하고자 연결시키는 구조패턴
- Client : Target을 사용하는 주체
- Target : 기준이 되는 클래스
- Adaptee : 변환되는 클래스
- Adaptor : Adaptee를 Target으로 변환시켜주는 클래스
디바이스 : 안드로이드폰, 아이폰
케이블 : C-Type, Lightning
충전기 : C-Type Portable Charger
가 있다고 가정해보자.
안드로이드폰은 C-Type 케이블과 연결해서 충전기를 사용할 수 있지만 아이폰은 Lightning 케이블을 C-Type으로 변환시키고 연결해야지만 충전할 수 있다. 어댑터 패던을 이용해 어댑티를 타겟으로 변환시키는 어댑터를 구현한다.
public interface CTypeCable {
public String getCTypeConnectDeviceName();
}
public interface LightningCable {
public String getLightningConnectDeviceName();
}
public class LightningToCTypeAdaptor implements CTypeCable {
private final LightningCable lightningCable;
public LightningToCTypeAdaptor(LightningCable lightningCable) {
this.lightningCable = lightningCable;
}
@Override
public String getCTypeConnectDeviceName() {
return lightningCable.getLightningConnectDeviceName();
}
}
public class Main {
public static void main(String[] args) {
Android android = new Android();
Iphone iphone = new Iphone();
CTypePortableCharger cTypePortableCharger = new CTypePortableCharger();
cTypePortableCharger.charging(android);
cTypePortableCharger.charging(new LightningToCTypeAdaptor(iphone));
}
}
장점
- 기존 코드를 변경하지 않아도 된다.
- 클래스 재활용성을 증가시킬 수 있다.
단점
- 코드 양이 늘어난다.
- 복잡도가 증가할 수 있다.
- 속도가 저하될 수 있다.