티스토리 뷰

728x90
반응형

어댑터 패턴


  • 어댑터 패턴은 이름에서 알 수 있는거처럼 어댑터처럼 사용되는 패턴입니다. 예를들어 마치 안드로이드 충전기에 아이폰 젠더를 사용하여 아이폰 휴대폰을 충전할 수 있도록 해주는 것입니다. 이처럼 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 동작할 수 있도록 해주는 패턴입니다.

 

 

클래스 다이어 그램


 

Client
  • 써드파티 라이브러리나 외부 시스템을 사용할려는 쪽입니다.
Target Interface
  • Adapter가 구현하는 인터페이스입니다. 클라이언트는 Target Interface를 통해 Adaptee에 접근하게 됩니다. Target Interface를 통해 어댑터에게 요청을 보냅니다.
Adapter
  • Client와 Adaptee 사이에서 호환성이 없는 둘을 연결시켜주는 역할을 담당하게 됩니다. Target Interface를 구현한 클래스이며, 클라이언트는 Adapter는 클라이언트의 요청을 Adaptee가 이해할 수 있는 방법으로 전달하고 처리는 Adaptee에서 이루어집니다.
Adaptee
  • 써드파티 라이브러리나 외부 시스템을 의미합니다.

 

호출 과정


 

예제 구조


 

Target Interface 역할을 하는 인터페이스
// 애플 제품
public interface AppleProduct {

    void charging(String name);    // 충전
    void playNumbers(String name); // 넘버스 실행
    void playKeynote(String name); // 키노트 실행
}

// 삼성 제품
public interface SamsungProduct {

    void charging(String name);       // 충전
    void playExecl(String name);      // 엑셀 실행
    void playPowerpoint(String name); // 파워포인트 실행
}

 

Adapter 역할을 하는 클래스
public class SamsungAdapter implements AppleProduct{

    private SamsungProduct samsungProduct;

    public SamsungAdapter(SamsungProduct samsungProduct) {
        this.samsungProduct = samsungProduct;
    }

    @Override
    public void charging(String name) {
        samsungProduct.charging(name);
    }

    @Override
    public void playNumbers(String name) {
        samsungProduct.playExecl(name);
    }

    @Override
    public void playKeynote(String name) {
        samsungProduct.playPowerpoint(name);
    }
}

 

Adaptee 역할을 하는 클래스들
// 애플 제품군에 속하는 Adaptee
public class MackBook implements AppleProduct {

    @Override
    public void charging(String name) {
        System.out.println(name + " 제품을 충전중입니다.");
    }

    @Override
    public void playNumbers(String name) {
        System.out.println(name + "파일을 실행시킵니다.");
    }

    @Override
    public void playKeynote(String name) {
        System.out.println(name + "파일을 실행시킵니다.");
    }
}

public class IPhone implements AppleProduct {

    @Override
    public void charging(String name) {
        System.out.println(name + " 제품을 충전중입니다.");
    }

    @Override
    public void playNumbers(String name) {
        System.out.println(name + "파일을 실행시킵니다.");
    }

    @Override
    public void playKeynote(String name) {
        System.out.println(name + "파일을 실행시킵니다.");
    }
}

// 삼성 제품군에 속하는 Adaptee
public class Galaxy implements SamsungProduct {

    @Override
    public void charging(String name) {
        System.out.println(name + " 제품을 충전중입니다.");
    }

    @Override
    public void playExecl(String name) {
        System.out.println(name + "파일을 실행시킵니다.");
    }

    @Override
    public void playPowerpoint(String name) {
        System.out.println(name + "파일을 실행시킵니다.");
    }
}

 

Client 클래스
public class Client {
    public static void main(String[] args) {

        AppleProduct iPhone = new IPhone();
        iPhone.charging("아이폰 미니 12");

        AppleProduct mackBook = new MackBook();
        mackBook.playNumbers("macBook의 Numbers");
        mackBook.playKeynote("macBook의 Keynoter");

        AppleProduct galaxy = new SamsungAdapter(new Galaxy());
        galaxy.charging("갤럭시 노트");
        galaxy.playNumbers("galaxy의 Execl");
        galaxy.playKeynote("galaxy의 Powerpoint");
    }
}

728x90
반응형