[디자인 패턴] Adapter 패턴 예제 :: 개발/일상_Mr.lee

[디자인 패턴] Adapter 패턴 예제

Posted by Mr.mandu.
2021. 1. 5. 21:32 개발/디자인패턴

안녕하세요.

디자인 패턴에 대해 차근차근 공부해 나가며 포스팅 하고 있습니다.

이번에는 Adapter 패턴에 대해 알아보겠습니다.


Adapter 패턴은 Wrapper 패턴으로 불리기도 하며,

'이미 제공되어 있는 것'과 '필요한 것' 사이의 차이를 없애주는 역할을 합니다.

Adapter 패턴에는 상속을 사용한 패턴위임을 사용한 패턴이 존재 합니다.

바로 예재를 통해 알아보겠습니다.


먼저, 상속을 사용한 패턴을 알아보겠습니다.

각 클래스 및 인터페이스의 역할을 미리 소개 하겠습니다.


 이미 제공되어 있는 것 

 Banner 클래스

 교환 장치

 PrintBanner 클래스 

 필요한 것

 Print 인터페이스 


'이미 제공되어 있는 것'의 역할인 Banner 클래스 입니다.


package Adapter_delegation;

public class Banner {
    private String string;
    public Banner(String string) {
        this.string = string;
    }
    public void showWithParen() {
        System.out.println("(" + string + ")");
    }
    public void showWithAster() {
        System.out.println("*" + string + "*");
    }
}

'필요한 것'의 역할인 Print 인터페이스 입니다.


package Adapter_class;

public interface Print {
    public abstract void printWeak();
    public abstract void printStrong();
}

printWeak(), printStrong() 추상 함수를 선언하여 필요한 함수를 정의하고 있습니다. 

이제 '교환 장치 역할'을 수행하는 PrintBanner 클래스를 확인해보겠습니다.


package Adapter_class;

public class PrintBanner extends Banner implements Print {
    public PrintBanner(String string) {
        super(string);
    }
    public void printWeak() {
        showWithParen();
    }
    public void printStrong() {
        showWithAster();
    }
}


Banner 클래스를 상속받아 함수를 활용하는 모습입니다.

활용 하는 함수에 대해서는

Pirnt 인터페이스에서 구현을 통해 수행하고 있습니다.


이제 이 모든 클래스 및 인터페이스를 수행하기 위한 메인 함수 입니다.


package Adapter_class;

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


실제 활용 부분에서는 printWeek(), printStrong() 함수를 통해 실행 되는 모습을 확인 할 수 있었습니다.


이번에는 위임을 사용한 Adapter 패턴을 알아보겠씁니다.


Print 클래스 입니다.


package Adapter_delegation;

public abstract class Print {
    public abstract void printWeak();
    public abstract void printStrong();
}


직전 에는 Print 인터페이스 였지만, 지금은 클래스 입니다.


이를 활용한 PrintBanner 클래스 입니다.


package Adapter_delegation;

public class PrintBanner extends Print {
    private Banner banner;
    public PrintBanner(String string) {
        this.banner = new Banner(string);
    }
    public void printWeak() {
        banner.showWithParen();
    }
    public void printStrong() {
        banner.showWithAster();
    }
}


소스를 보시면 이번에는 직접 함수를 수행하는 것이 아니라,

Banner 클래스를 활용하여 수행하는 모습을 볼 수 있습니다.


이렇게 Adapter 패턴은 기존의 클래스를 개조해서 필요한 클래스를 만듭니다.

만약 버그가 발생하더라도 기존의 소스에는 버그가 없기 때문에

Adapter 역할을 하는 클래스 중점적으로 조사하면 된다는 이점이 있습니다.



※ 본 포스팅은 Java언어로 배우는 디자인 패턴 입문 책을 공부하며 작성하고 있습니다.