6.    The Adapter Pattern

클래스가 갖는 프로그래밍 인터페이스를 다른 클래스의 프로그래밍 인터페이스로 변화시킨다.하나의 프로그램에서 서로 관련이 없는 클래스들을 함께 일하도록 만들고 싶을 때Adapter패턴을 사용한다. Adapter패턴의 개념은 매우 단순해질 수도 있다.개발자가 원하는 인터페이스를 갖는 클래스를 작성한 후 해당 클래스가 다른 클래스와 메시지를 주고 받도록 만든다.이런 작업을 수행하는 방법에는 두 가지가 있다.상속에 의해서 그리고 객체구성(위임)에 의해서이다.처음에 개발자는 다른 클래스에서 새로운 클래스를 파생시킨 후 해당 클래스가 원하는 인터페이스와 호응하도록 메소드를 첨가하는 방식을 취한다.두 번째 방법에서는 새로운 클래스 내부에 원본 클래스를 포함시킨 후 새로운 클래스 안에서의 호출 작업을 변환하는 메소드를 생성한다.이런 두가지 방식을 각각 클래스 어댑터와 객체 어댑터로 부른다.

 

구조

사용자 삽입 이미지

상속을 이용한 방법

사용자 삽입 이미지

위임을 이용한 방법

 

역할

v     Target의 역할

필요로 하는 메소드를 제공하는 역할

 

v     Client의 역할

Target역할의 메소드를 사용하는 의로자

 

v     Adaptee의 역할

적합되는 측 사용할 메소드가 이미 정의되어있는 객체

 

v     Adapter의 역할

적합하는 측

 

의도

클래스의 인터페이스를 다른 필요한 클래스의 인터페이스에 맞게 변환해준다. Adapter는 서로 호환성이 없는 인터페이스들끼리라도 같이 작동할 수 있게끔 해준다.

 

적용시기

다음과 같은 경우에AdapterPattern를 이용한다.

  • 이미 만들어져 있는 클래스를 사용하고 싶지만,인터페이스가 원하는 방식과 일치하지 않을때.
  • 관련성이 없거나,예측하지 못한 클래스들과 협동하는 재사용가능한 클래스를 생성하기 원할때.이 경우 클래스들이 호환성을 가지는 인터페이스를 필요로 하지 않는다.
  • (object adapter의 경우에만 해당)현재 이미 만들어진 여러개의subclass가 필요한 경우,하지만 각각의 서브클래스들에 대한 인터페이스를 하는 것은 비효율적이다.이 경우parent class의 인터페이스를adapt할 수 있다.

예제소스

사용자 삽입 이미지

예제 소스

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 + "*");

   }

}

 

public interface Print {

   public abstract void printWeak();

   public abstract void printStrong();

}

 

public class PrintBanner extends Banner implements Print {

   public PrintBanner(String string) {

       super(string);

   }

   public void printWeak() {

       showWithParen();

   }

   public void printStrong() {

       showWithAster();

   }

}

 

public class mainClass {

   public static void main(String[] args) {

       Print p = new PrintBanner("Hello");

       p.printWeak();

       p.printStrong();

   }

}

 

 

관련패턴

사용자 삽입 이미지
      Bridge패턴: Adapter패턴은 인터페이스가 다른 클래스들을 연결하는 패턴이고, Bridge패턴은 기능의 계층과 구현의 계층을 연결하는 패턴이다.

사용자 삽입 이미지
      Decorator패턴: Adapter패턴은 인터체이스가 다른 것을 메우기 위한 패턴이고, decorator패턴은 인터페이스를 변경하지 않고 기능을 추가하는 패턴입니다.

 


Posted by 영웅기삼
,