예를 들어, 직류 12볼트 노트북을 교류 100볼트 AC전원에 연결한다고 가정하자
그때 우리는 AC 어댑터라는 장치를 사용한다. AC 어댑터는 '교류 100볼트'를 지금 필요한 '직류 12볼트'로 변환한다
프로그램 세계에서도 이미 제공된 코드를 그대로 사용할 수 없을때, 필요한 형태로 변환한 후 이용하는 경우가 있는데, '이미 제공된 것'과 '필요한 것'사이의 '차이'를 메우는게 Adapter Pattern
Hello라는 문자열을
(Hello)
,*Hello*
로 표시하는 프로그램
전원의 비유 | 예제 프로그램 | |
---|---|---|
제공된 것 | 교류 100볼트 | Banner 클래스(showWithParen, showWithAster) |
변환 장치 | 어댑터 | PrintBanner 클래스 |
필요한 것 | 직류 12볼트 | Print 인터페이스(printWeak, printStrong) |
// 미리 제공되는 클래스
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 + "*");
}
}
showWithParen
, showWithAster
를 상속받음printWeak
, printStrong
을 구현public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
// 어댑터 역할
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak(); // (Hello) 출력
p.printStrong(); // *Hello* 출력
}
}
위에서 본 예제는 '클래스를 사용한' Adapter 패턴 아래 예제는 '인스턴스를 사용한' Adapter 패턴
// 인터페이스가 아닌 클래스
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
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();
}
}
printWeak
호출시 자신이 처리하지않고 Banner의 메소드에 위임