본문 바로가기
카테고리 없음

Adapter pattern

by 최고영회 2013. 12. 21.
728x90
반응형
SMALL

'이미 제공되어 있는 것' 과 '필요한 것' 사이의 '차이' 를 없애주는 디자인 패턴.

 

Wrapper pattern 으로 불리기도 한다.

 

Adapter pattern의 등장인물

- Target(대상) 의 역할 (아래 예제에서 Print interface or Print class)

- Client(의뢰자) 의 역할 (아래 예제에서 Main class)

- Adaptee(개조되는 쪽)의 역할 (아래 예제에서 Banner class)

- Adapter의 역할 (아래 예제에서 PrintBanner class)

 

 

- 클래스에 의한 Adapter pattern (상속을 사용한 Adapter pattern)

 

예제 프로그램)

 문자열을 괄호로 묶어 표시하는 showWithParen() 과 * 로 묶어 표시하는 showWithAster() 를 포함하는 Banner class

 '이미 제공되어 있는 것' 에 해당하는 Banner class

public class Banner {

private String str;

 public Banner(String str) {

   this.str = str;

 }

 public void showWithParen() {

   System.out.println( "(" + str + ")" );

 }

 public void showWithAster() {

   System.out.println( "*" + str + "*" );

 }

}

 

 문자열을 느슨하게(괄호 이용) 표시하는 printWeak() 과 문자열을 강하게 (* 이용) 표시하는 printStrong() 을 포함하는 Print Interface

public interface Print {

  public abstract void printWeak();

  public abstract void printStrong();

}

  

 Adapter 역할을 수행하는 PrintBanner class

public class PrintBanner extends Banner implements Print {

  public PrintBanner(String str) {

   super(str);

  }

  public void printWeak() {

     showWithParen();

  }

  public void printStrong() { 

     showWithAster();

  }

}

 

 Main class

public class Main {

  public static void main(String[] args) {

    Print p = new PrintBanner("hello");

    p.printWeak();

    p.printStrong();

  }

}

    

 

- 인스턴스에 의한 Adapter pattern (위임을 사용한 Adapter pattern)

 Print interface가 class 인 경우 

public abstract class Print {

  public abstract void printWeak();

  public abstract void printStrong();

}

  

Adapter 역할을 수행하는 PrintBanner class

public class PrintBanner extends Print{

  private Banner banner;

  public PrintBanner(String str) {

    this.banner = new Banner(str);

  }

  public void printWeak() {

     banner.showWithParen();

  }

  public void printStrong() { 

     banner.showWithAster();

  }

}

 

메소드가 필요하면 그냥 프로그래밍 하면 되지 왜 Adapter pattern이 필요한 것일까? 어떤 경우에 사용하는 것일까?

 

이미 존재하고 있는 클래스를 이용하는 경우 , 특히 그 클래스가 버그가 없으며 실제로 지금까지 사용된 실적이 있다면

어떻게든 그 클래스를 부품으로 재이용하고 싶을 것이다.

- 이렇게 이미 만들어진 클래스를 새로운 인터페이스(API)에 맞게 개조시킬 때 이 패턴을 사용하게 된다.

Adapter pattern은 기존의 클래스를 개조해서 필요한 클래스를 만든다. 

만약 버그가 발생하더라도 기존의 클래스에는 버그가 없으므로 Adapter 역할의 클래스를 중점적으로 조사하면 되고, 프로그램 검사도 상당히 쉬워진다.

 

실제로 우리는 새로운 인터페이스(API)에 맞게 개조시킬 때 기존 클래스의 source를 바꿔서 '수정' 하려고 한다.

그러나 이렇게 되면 동작 테스트가 이미 끝난 기존의 클래스를 다시 한번 테스트 해야 한다.

Adapter pattern은 기존의 클래스를 전혀 수정하지 않고 목적한 인터페이스(API)에 맞추려는 것이다.

또한 기존 클래스의 소스가 반드시 필요한 것이 아니다. 기존 클래스의 사양만 알면 새로운 클래스를 만들 수 있다.

 

- 버전 업과과 호환성을 고려할 경우

구버전과 신버전을 공존시키고, 유지와 보수도 편하게 하기 위해서 Adapter pattern이 도움이 되는 경우가 많다.

 

- 관련 패턴

Bridge pattern, Decorator pattern

 

728x90
반응형
LIST