'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를 이용해서 기존 클래스를 건드리지 않고 재사용할 수 있다.
반응형