어댑터 패턴(Adapter Pattern)
특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환합니다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줍니다.
구성 요소
- Client: Target 인터페이스를 통해 어댑터를 사용하여 기능을 요청하는 주체입니다.
- Target(I): 클라이언트가 사용할 수 있는 인터페이스를 정의합니다. 클라이언트는 이 인터페이스를 통해 서비스를 사용합니다.
- Adapter: Target 인터페이스를 구현하며, 하나 이상의 기존 인터페이스를 사용하여 클라이언트의 요청을 처리합니다. 어댑터는 클라이언트와 기존 클래스 간의 중재 역할을 합니다.
- Adaptee: 호환되지 않는 인터페이스를 가진 기존 클래스입니다. 어댑터는 이 클래스를 사용하여 클라이언트의 요청을 처리합니다.
코드
Client:
public class DuckTestDrive {
public static void main(String[] args) {
Duck duck = new MallardDuck(); // 기존에 있던 오리
duck.quack();
duck.fly();
Turkey turkey = new WildTurkey(); // 새로 생긴 칠면조
Duck turkeyAdpater = new TurkeyAdapter(turkey);
turkeyAdpater.quack();
turkeyAdpater.fly();
}
}
Target(I):
interface Duck {
void quack();
void fly();
}
Apdapter:
public class TurkeyAdapter implements Duck {
private final Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
for(int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
Apaptee:
interface Turkey {
void gobble();
void fly();
}
public class WildTurkey implements Turkey {
public void gobble() {
System.out.pirntln("골골");
}
public void fly() {
System.out.pirntln("짧은 거리를 날고 있어요!");
}
}
장단점
장점:
- 호환성: 서로 다른 인터페이스를 가진 클래스들을 연결하여 호환성을 제공합니다. 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있습니다.
- 유연성: 클라이언트 코드와 어댑티 간의 의존성을 줄여줍니다. 클라이언트는 어댑터를 통해 다양한 어댑티를 사용할 수 있습니다.
- 재사용성: 이미 존재하는 클래스를 재사용할 수 있어, 개발 시간을 줄이고 코드의 중복을 최소화합니다.
- 클래스의 분리: 어댑터는 클라이언트와 어댑티 간의 중재자 역할을 하여, 코드의 모듈화를 촉진합니다.
단점:
- 복잡성 증가: 어댑터 클래스를 추가함으로써 시스템의 복잡성이 증가할 수 있습니다. 코드가 직관적이지 않게 보일 수 있습니다.
- 성능 저하: 추가적인 어댑터 호출로 인해 성능이 약간 저하될 수 있습니다. 하지만 대부분의 경우에는 미미한 성능 차이에 그칩니다.
- 다중 상속 제한: 언어에 따라 다중 상속이 제한되어 있어, 여러 어댑티를 동시에 지원하는 것이 어려울 수 있습니다.
활용 사례:
- 레거시 시스템 통합: 기존 시스템과 새 시스템 간의 호환성을 제공하여 레거시 시스템을 최신 시스템에 통합할 때 어댑터 패턴을 사용할 수 있습니다. 예를 들어, 오래된 데이터베이스와 새로운 애플리케이션 간의 데이터 전송을 처리할 수 있습니다.
- 소프트웨어 라이브러리 통합: 서로 다른 소프트웨어 라이브러리를 통합하여 사용할 때 어댑터 패턴이 유용합니다. 예를 들어, 특정 그래픽 라이브러리와 게임 엔진 간의 인터페이스를 맞추기 위해 어댑터를 사용할 수 있습니다.
- 서드파티 서비스 통합: 다양한 서드파티 API를 사용하여 애플리케이션을 개발할 때 어댑터 패턴을 사용하여 일관된 인터페이스를 제공합니다. 예를 들어, 여러 결제 게이트웨이와 통합할 때 어댑터를 사용하여 공통 인터페이스를 구현할 수 있습니다.
'TIL' 카테고리의 다른 글
안드로이드 알림 전송에서 CacheBuilder를 활용한 토큰 관리 (0) | 2024.07.20 |
---|---|
헤드 퍼스트 디자인 패턴 | 07장 적응시키기 (퍼사드 패턴) (0) | 2024.07.18 |
헤드 퍼스트 디자인 패턴 | 06장 호출 캡슐화하기 (커맨드 패턴) (0) | 2024.07.14 |
헤드 퍼스트 디자인 패턴 | 05장 하나뿐인 특별한 객체 만들기 (싱글턴 패턴) (0) | 2024.07.04 |
윷놀이에서 개가 나올 확률은 얼마나 될까? (0) | 2024.06.27 |