'이미 제공된 것'과 '필요한 것' 사이에 들어가서 그 사이를 채우는 것이 어댑터의 역할
adapter - 적응시키는 것, wrapper 패턴이라고도 불림
프로그램의 세계에서도 이미 제공된 코드를 그대로 사용할 수 없을 때 필요한 형태로 변환한 후 이용한다
- 클래스에 의한 Adapter 패턴 (상속을 사용한 패턴)
- 인스턴스에 의한 Adapter 패턴 (위임을 사용한 패턴)
1. Banner 클래스를 상속받아 필요한 Print 인터페이스를 구현
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();
}
- Adapter 역할: 준비된 Banner 클래스를 확장하고, 필요한 인터페이스를 구현
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}
@Override
public void printWeak() {
showWithParen();
}
@Override
public void printStrong() {
showWithAster();
}
}
- Main에서는 Print 인터페이스를 사용해서 프로그래밍
public class Main {
public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}
2. 어떤 메서드의 실제 처리를 다른 인스턴스의 메서드에 맡김 (= 위임)
- Banner 필드를 통해 메서드 호출
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();
}
}
- 기존의 클래스를 재사용하여 필요한 클래스를 만든다
- 필요한 메서드군을 빠르게 만들 수 있다
- 기존의 클래스에 버그가 없는 걸 알고 있으므로 프로그램 검사가 매우 편해진다
- 기존의 클래스를 전혀 수정하지 않고 목적한 인터페이스(API)에 맞춘다
- 신버전과 구버전을 공존시키고 유지 보수까지 편하게 하도록 도와준다
- Adaptee와 Target 기능이 너무 동떨어진 경우에는 Adapter 패턴을 사용할 수 없다
- 일반적으로 상속보다 위임을 사용하는 편이 문제가 적다
'문제 및 이론 정리 > 디자인패턴' 카테고리의 다른 글
[디자인패턴] Observer - 상태 변화를 알려준다 (0) | 2025.05.20 |
---|---|
[디자인패턴] Builder - 복잡한 인스턴스를 조립한다 (0) | 2025.04.11 |
[디자인패턴] Facade - 단순한 창구를 만든다 (0) | 2025.03.05 |
[디자인패턴] Factory Method - 하위 클래스에서 인스턴스를 만든다 (0) | 2025.03.02 |
[디자인패턴] State - 상태를 클래스로 표현한다 (0) | 2025.02.25 |