도서 요약 / / 2023. 1. 15. 20:49

[JAVA 언어로 배우는 디자인 패턴 입문] Adapter 패턴

'JAVA 언어로 배우는 디자인 패턴 입문'의 내용을 정리한 것입니다.

Adapter 패턴

  • 이 책에서는 Adapter 패턴을 설명하기 위해 직류 -> 교류 변환 어댑터를 예로 설명을 하고 있다.
  • 'AC 어댑터'를 통해 '교류 100볼트'를 지금 필요한 '직류 12볼트'로 변환을 하는데 제공된 것(교류)과 필요한 것(직류) 사이에 들어가서 그 사이를 채우는 것이 어댑터의 역할이다.



Adapter 패턴에는 두 가지가 있다.

  • 클래스에 의한 Adapter 패턴(상속)
  • 인스턴스에 의한 Adapter 패턴(위임)

 

예제 프로그램 (1) - 상속을 사용한 패턴

예제로 Hello라는 주어진 문자열을 다음과 같이 표시한다.(괄호와 별표로 나타냄)

  • (Hello)
  • *Hello*

 

 

Banner 클래스

Banner 클래스는 미리 제공되는 클래스 (Adaptee)

@AllArgsConstructor
public class Banner {

    private String string;

    public void showWithParen() {
        System.out.println("(" + string + ")");
    }

    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

Printer 인터페이스

Printer 인터페이스는 필요로 하는 인터페이스

public interface Print {

    void printWeak();

    void printStrong();
}

PrintBanner 클래스

PrintBanner 클래스는 어댑터 역할

public class PrintBanner extends Banner implements Print {

    public PrintBanner(String string) {
        super(string);
    }

    @Override
    public void printWeak() {
        showWithParen();
    }

    @Override
    public void printStrong() {
        showWithAster();
    }
}

Main 클래스

Main 클래스는 어댑터 역할을 하는 PrintBanner 클래스를 이용해 Hello 문자열을 약하게(괄호로 묶음) 혹은 강하게(*로 묶음) 표시한다.

public class Main {

    public static void main(String[] args) {
        Print p = new PrintBanner("Hello");
        p.printWeak();
        p.printStrong();
    }
}

실행 결과

(Hello)

*Hello*

Main 클래스 입장에서는 Banner가 어떻게 동작하는지 알 필요가 없다. 단지 Print 인터페이스에 맞춰서 개발하면 되는 것이다.

마치 노트북이 직류 12볼트로 동작하지만 실제로는 전원이 교류 100볼트이라는 것을 몰라도 되는 것과 비슷하다.



예제 프로그램(2) - 위임을 사용한 패턴

Print 클래스

public abstract class Print {

    public abstract void printWeak();

    public abstract void printStrong();
}

PrintBanner 클래스

public class PrintBanner extends Print {

    private Banner banner;

    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }

    @Override
    public void printWeak() {
        banner.showWithParen();
    }

    @Override
    public void printStrong() {
        banner.showWithAster();
    }
}



Target(대상) 역

노트북을 작동시키는 직류 12볼트. 예제 프로그램에서는 Print 인터페이스(상속의 경우)와 Print 클래스(위임의 경우)가 이 역할.

Client(의뢰자) 역

직류 12볼트로 작동하는 노트북. 예제 프로그램에서는 Main 클래스가 해당

Adaptee(적응 대상자) 역

Adaptee는 이미 준비된 메소드를 가지는 역할. 교류 100볼트인 AC 전원. 예제 프로그램에서는 Banner 클래스가 이 역할.

Adapter(적응자) 역

Adapter 패턴의 주인공. Adaptee의 메소드를 사용해서 어떻게던 Target을 만족시키는 것이 Adapter 패턴의 목적이며 Adapter의 임무. 교류 100볼트를 직류 12볼트로 변환하는 어댑터에 해당.

정리

  • 어댑터 패턴을 왜 사용할까? 그냥 개발하면 되지 않을까?
  • 이미 특정 클래스가 테스트도 완료되고 잘 쓰고 있는데 그 클래스를 부품으로 재사용하고 싶은 경우가 있다.
  • 이럴 때를 위해서 Adapter를 이용해서 기존 클래스를 건드리지 않고 재사용할 수 있다.



반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유