[Design Pattern] GoF 구조 패턴 - 어댑터 패턴(Adapter Pattern)



어댑터 패턴(Adapter Pattern)

GoF 디자인 패턴 중 구조 패턴에 해당한다.
클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴이다. 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.
안드로이드 개발 시 자주 보게 되는 패턴 중 하나이므로 개념 정리를 해보았다.


사용법

  • 기존 클래스를 사용하고 싶은데 인터페이스가 맞지 않을 때
  • 기존에 만들어 놓은 것을 재사용하고 싶은데 그것을 수정할 수 없을 때


구조

클래스 어댑터(Class Adapter)

img

  • Adaptee는 변환이 필요하다.
  • Adaptor가 Adaptee를 필요한 형태로 변환시켜주고 Client는 Adaptor를 통해 이를 사용한다.
  • 자바의 상속을 이용한다.


객체 어댑터(Object Adapter)

img

  • 객체 어댑터 패턴에서 Adapter는 Adaptee의 인스턴스를 가진다.
  • 자바의 합성을 이용한다.


장점

  • 관련성이 없는 인터페이스를 같이 사용할 수 있음
  • 클래스 재사용성 증가


예제

클래스 다이어그램

img


패키지 구조

img


구현

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


소스 코드

전체 소스 코드



:bookmark: REFERENCE
에릭 감마 외 3명, 「GoF의 디자인 패턴」, 피어슨에듀케이션코리아
어댑터 패턴
[구조 패턴] 어댑터 패턴(Adapter Pattern) 이해 및 예제