어댑터 패턴(Adapter Pattern)

박세건·2024년 5월 21일
0

디자인 패턴

목록 보기
10/17
post-thumbnail

어댑터 패턴이란, 이름에서 볼 수 있듯이 일반적인 방법으로는 사용하지 못하는 서비스에 대해서 어댑터 라는 객체를 만들어서 클라이언트가 서비스를 사용할 수 있게끔 해주는 구조 패턴
110V 가전제품을 220V 어댑터를 통해서 사용하는 개념
즉, 호환성이 없는 인터페이스 때문에 동작할 수 없는 클래스들을 함께 작동 할 수 있도록 변환

구조

어댑터 패턴에는 두가지 구조가 있다

  • 합성을 이용한 어댑터 패턴
  • 상속을 이용한 어댑터 패턴

합성 구조

사용할 수 없는 adaptee 클래스를 사용하기위해서 Adapter 클래스가 adaptee를 합성하여 사용할 수 있게하고 사용자는 Adapter 클래스를 사용하므로 adaptee를 사용할 수 있게된다.

// Adaptee : 클라이언트에서 사용하고 싶은 기존의 서비스 (하지만 호환이 안되서 바로 사용 불가능)
class Service {

    void specificMethod(int specialData) {
        System.out.println("기존 서비스 기능 호출 + " + specialData);
    }
}

// Client Interface : 클라이언트가 접근해서 사용할 고수준의 어댑터 모듈
interface Target {
    void method(int data);
}

// Adapter : Adaptee 서비스를 클라이언트에서 사용하게 할 수 있도록 호환 처리 해주는 어댑터
class Adapter implements Target {
    Service adaptee; // composition으로 Service 객체를 클래스 필드로

    // 어댑터가 인스턴스화되면 호환시킬 기존 서비스를 설정
    Adapter(Service adaptee) {
        this.adaptee = adaptee;
    }

    // 어댑터의 메소드가 호출되면, Adaptee의 메소드를 호출하도록
    public void method(int data) {
        adaptee.specificMethod(data); // 위임
    }
}
class Client {
    public static void main(String[] args) {
        // 1. 어댑터 생성 (기존 서비스를 인자로 받아 호환 작업 처리)
        Target adapter = new Adapter(new Service());

        // 2. Client Interfac의 스펙에 따라 메소드를 실행하면 기존 서비스의 메소드가 실행된다.
        adapter.method(1);
    }
}

클래스 구조

Target 인터페이스를 통해서 어댑터를 정의해주었고 이 어탭터 클래스가 Service 클래스를 상속받아서 service의 내부 기능을 사용할 수 있게 설정
클라이언트는 어댑터 클래스를 통해서 service의 내부 기능을 사용

Client에서 접근할 수 없던 Service 클래스를 사용하기 위해서 Adpater 클래스를 만들어주고 Adapter클래스가 Service 클래스를 상속받도록 설계하고, 인터페이스를 통해 해당 Service를 접근할 수 있도록 Target 인터페이스를 생성합니다.
해당 Target 인터페이스의 메서드를 정의하는 과정에서 Service의 함수를 사용할 수 있도록 설정

// Adaptee : 클라이언트에서 사용하고 싶은 기존의 서비스 (하지만 호환이 안되서 바로 사용 불가능)
class Service {

    void specificMethod(int specialData) {
        System.out.println("기존 서비스 기능 호출 + " + specialData);
    }
}

// Client Interface : 클라이언트가 접근해서 사용할 고수준의 어댑터 모듈
interface Target {
    void method(int data);
}

// Adapter : Adaptee 서비스를 클라이언트에서 사용하게 할 수 있도록 호환 처리 해주는 어댑터
class Adapter extends Service implements Target {

    // 어댑터의 메소드가 호출되면, 부모 클래스 Adaptee의 메소드를 호출
    public void method(int data) {
        specificMethod(data);
    }
}
class Client {
    public static void main(String[] args) {
        // 1. 어댑터 생성
        Target adapter = new Adapter();

        // 2. 인터페이스의 스펙에 따라 메소드를 실행하면 기존 서비스의 메소드가 실행된다.
        adapter.method(1);
    }
}

장점

  • 인터페이스를 통해 작동하기 때문에 개방 패쇄 원칙 준수
  • 인터페이스를 구성하여 비즈니스 로직을 분리 했기 때문에 단일 책임원칙 준수
  • 추가적인 기능은 어댑터에 추가해서 사용 가능

단점

  • 인터페이스와 어댑터 클래스가 구현되어야 하기때문에 복잡성 증가
  • 직접적으로 서비스(adaptee)를 수정하는 것이 더 효율적일 수 있으므로 신중히 선택
profile
멋있는 사람 - 일단 하자

0개의 댓글