2009년 9월 29일 화요일

Adapter Pattern


- Adapter Pattern이란 무엇인가..

어댑터는 'adapt(개조) 시키는 것'이라는 의미입니다. 예를 들어 직류 12볼트로 작동하는 노트북을 교류 100볼트의 AC 전원에 연결한다고 가정하면 이때 우리는 AC 어댑터라는 장치를 사용합니다. AC 어댑터느 가정용 전원으로 제공되고 있는 교류 100볼트를 지금 필요한 직류 12볼트로 교환해줍니다. 제공되고 있는 것과 필요한 것 사이를 연결해주는 것이 어댑터의 역할입니다.

즉, AC 어댑터의 역할은 직류 12볼트의 컴퓨터를 교루 100볼트의 환경에 맞게 바꾸는 것입니다.

프로그램의 세계에서도 이미 제공되어 있는 것을 그대로 사용할 수 없을때, 필요한 형태로 교환하고 사용하는 일이 자주 있습니다. '이미 제공되고 있는 것' 과 '필요한 것' 사이의 '차이'를 없애주는 디자인 패턴이 Adapter Pattern 입니다.

 

위의 글을 책에서 읽었을때 처음 생각난것이 네트워크 시간에 배웠던 IPv4와 IPv6였다.. 후훗..;; 맞나 -0-

 

- Adapter Pattern에는 다음과 같이 두 가지의 종류가 있습니다.

    1. 클래스에 의한 Adapter 패턴(상속)

    2. 인스턴스에 의한 Adapter 패턴(위임)

 

- 예제 프로그램을 만들어 보겠습니다.

주어진 문자열을 다음과 같이 표시하는 간단한 것입니다.

펼쳐두기..

 

   전원의 비유  예제 프로그램
 제공되고 있는 것  교류 100볼트

 Banner 클래스

 (showWithParen,showWithAster)

 교환장치  어댑터

 PrintBanner 클래스

 필요한 것  직류 12볼트

 Print 인터페이스

 (printWeak, printStrong)


 

Banner 클래스

: 미리 제공되어 있는 클래스라고 가정

펼쳐두기..

 

Print 인터페이스

펼쳐두기..


PrintBanner 클래스

:어댑터의 역할을 완수합니다. 준비된 Banner클래스를 확장(extends)해서 showWithParen 메소드와 showWithAster 매소드를 상속합니다. 또한 필요한 Print 인터페이스를 구현(implements)해서 printWeak 메소드와 printStrong 메소드를 구현합니다.

펼쳐두기..


Main 클래스

:어댑터 역할의 PrintBanner 클래스를 사용해서 Hello라는 문자열을 약하게(괄호를 붙임) 또는 강하게(*를 붙임) 표시합니다.

펼쳐두기..

 


이번에는 인스턴스에 의한 Adapter 패턴을 해보겠습니다.

Main클래스, Banner 클래스는 위의 클래스에 의한 것과 같습니다. 그러나 Print는 인터페이스가 아니고 클래스라고 가정합니다.

즉, Banner클래스를 이용하여 Print 클래스와 동일한 메소드를 갖는 클래스를 실현하려는 것입니다.

 

 

Print 클래스

펼쳐두기..

 

PrintBanner 클래스

펼쳐두기..

 

 

- 클래스에 의한 Apapter 패턴의 클래스 다이어그램(상속을 사용)

 

- 인스턴스에 의한 Adapter 패턴의 클래스 다이어그램(위임을 사용)

Target(대상) 역할

: 지금 필요한 메소드를 결정합니다. 노트북을 작동시키기 위한 직류 12볼트에 해당합니다. 예제 프로그램에서는 Print 인터페이스나 Print 클래스가 이 역할을 합니다.

 

Client(의뢰자) 역할

: Target 역할의 메소드를 사용해서 일을 합니다. 직류 12볼트로 움직이는 노트북에 해당합니다. 예제 프로그램에서는 Main에 클래스가 이 역할을 합니다.

 

Adaptee(개조되는 쪽) 역할

: 이미 준비되어 있는 메소드를 가지고 있는 역할입니다. 교류 100볼트의 AC전원에 해당하며, 예제 프로그램에서는 Banner 클래스가 이 역할을 합니다.

 

Adapter 역할

: Adaptee 역할의 메소드를 사용해서 어떻게든 Target 역할을 만족시키기 위한 것이 Adapter 패턴의 목적이며, Adapter 역할의 임무입니다. 예제 프로그램에서는 PrrintBanner 클래스가 Adapter의 역할입니다.

 

 

댓글 없음:

댓글 쓰기