4. D-4
Adapter 패턴의 해결
• 전제 조건
– 이미 제공되고 있는 인터페이스 혹은 클래스가 있다.
– 그것을 현재 그대로 사용할 수 없다.
• 해결법
– 그 인터페이스를 자신이 사용할 수 있도록 기존의 인터페이스를
상속받아 알맞게 변환해주는 클래스를 만든다. (상속)
– 그 클래스를 위임하는 Adapter 클래스를 만든다. (위임)
5. Adpater 패턴 예제 - 상속
• 구성
– 이미 제공되고 있는 Banner 클래스
– 내가 사용하려는 print 인터페이스
– 글자를 표시하고 출력할 Main 클래스
• 해결방안
– Banner 클래스와 print 인터페이스를 상속한다.
– 그리고 print 인터페이스를 Banner의 메소드를 이용해 구현한다.
– 이 파일을 PrintBanner 클래스라고 한다.
B-5
6. 예제 소스 분석
기존에 제공하는 Banner 클래스.
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 + "*");
}
}
B-6
7. 예제 소스 분석
사용하려는 Print 인터페이스
public interface Print {
//약하게 출력하는 메소드
public abstract void printWeak();
//강하게 출력하는 메소드
public abstract void printStrong();
}
B-7
8. 예제 소스 분석
변환을 위해 만든 어댑터 클래스
// 변환을 위해 Banner와 Print를 상속받는다.
public class PrintBanner extends Banner implements Print {
//출력을 원하는 문자열을 초기화.
public PrintBanner(String string) {
super(string);
//super 메소드를 통해 Banner가 초기화됨.
}
//문자를 약하게 출력
public void printWeak() {
showWithParen();
//Banner 클래스의 메소드를 통해 출력
}
//문자를 강하게 출력
public void printStrong() {
showWithAster();
//Banner 클래스의 메소드를 통해 출력
}
}
B-8
9. 예제 소스 분석
Main 클래스
public class Main {
public static void main(String[] args) {
//내가 사용하길 원하는 Print 객체 선언 후 어댑터를 통해 초기화
Print p = new PrintBanner("Hello");
//어댑터의 객체를 통해 출력
p.printWeak();
p.printStrong();
}
}
B-9
10. 예제 소스 분석
Main 클래스
public class Main {
public static void main(String[] args) {
//내가 사용하길 원하는 Print 객체 선언 후 어댑터를 통해 초기화
Print p = new PrintBanner("Hello");
//어댑터의 객체를 통해 출력
p.printWeak();
p.printStrong();
}
}
B-10
12. Adpater 패턴 예제 - 위임
• 구성
– 이미 제공되고 있는 Banner 클래스
– 내가 사용하려는 print 클래스
– 글자를 표시하고 출력할 Main 클래스
• 해결방안
– print 클래스의 기능을 위임하는 클래스를 생성한다.
– Banner 인스턴스를 선언하고 print의 메소드를 구현한다.
– 이 파일을 PrintBanner 클래스라고 한다.
B-12
13. 예제 소스 분석
기존에 제공하는 Banner 클래스.
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 + "*");
}
}
B-13
14. 예제 소스 분석
사용하려는 Print 인터페이스
public abstract Print {
//약하게 출력하는 메소드
public abstract void printWeak();
//강하게 출력하는 메소드
public abstract void printStrong();
}
B-14
15. 예제 소스 분석
변환을 위해 만든 어댑터 클래스
// 변환을 위해 Banner와 Print를 상속받는다.
public class PrintBanner extends Print {
//Banner 인스턴스를 생성
private Banner banner;
//banner 인스턴스를 통해 Banner가 초기화됨.
public PrintBanner(String string) {
this.banner = new Banner(string);
}
//Banner 인스턴스의 메소드를 통해 문자를 약하게 출력
public void printWeak() {
banner.showWithParen();
}
//Banner 인스턴스의 메소드를 통해 문자를 강하게 출력
public void printStrong() {
banner.showWithAster();
}
}
B-15
16. 예제 소스 분석
Main 클래스
public class Main {
public static void main(String[] args) {
//내가 사용하길 원하는 Print 객체 선언 후 어댑터를 통해 초기화
Print p = new PrintBanner("Hello");
//어댑터의 객체를 통해 출력
p.printWeak();
p.printStrong();
}
}
B-16