더보기
구조패턴 : 클래스나 객체를 상속과 합성을 통하여 더 큰 구조를 만드는 패턴
어댑터 패턴
서로 관계가 없는 인터페이스들을 어댑터 객체를 두어 함께 사용할 수 있도록 하는 패턴
어댑터패턴 구조
상황예시)
A사 노티발송시스템을 사용 중이지만 추후 B사 노티발송 시스템을 이용하려 한다.
이 때, A사 노티발송시스템을 이미 사용하면서 설계된 클래스와 데이터들이 있어
변경없이 B사노티발송시스템을 사용하고 싶다.
=>즉, 서로 다른 인터페이스를 함께 동작시킬 수 있도록 하고 싶다.
1. 우선 A사 노티발송시스템을 구현한다.
//노티발송 인터페이스
interface NotiProcessor{
void doNoti();
}
//A사노티발송 구현 클래스
class ANotiProcssor implements NotiProcessor{
@Override
public void doNoti() {
System.out.println("A사 노티 프로세스 실행");
}
}
2. B사가 전달해준 노티발송 클래스 내부를 보면 아래와 같다. 당연히 인터페이스 규격이나 메소드명 또한 다르다.
//B사 노티발송프로레스 클래스
class BNotiProcssor {
@Override
public void sendBNoti() {
System.out.println("A사 노티 프로세스 실행");
}
}
문제가 있다!!!!
ANotiProcessor와 BNotiProcessor를 동일한 인터페이스를 구현받도록 하려면 A사 및 B사 모두 수정 요청을 해야 한다.
이 경우, 어댑터 패턴을 적용해 볼 수 있다.
기존 A사,B사 코드 그대로 유지한 채 어댑터 객체를 만든다.
//어댑터 객체
class NotiProcessorAdapter implements NotiProcessor{
private BNotiProcssor bNotiProcssor ;
public NotiProcessorAdapter(BNotiProcssor bNotiProcssor){
this.bNotiProcssor = new BNotiProcssor();
}
@Override
public void doNoti() {
//행동 위임
this.bNotiProcssor.sendBNoti();
}
}
아래와 같이 수정없이 B사시스템을 사용할 수 있다!!!
public static void main(String[] args) {
//A사노티시스템 발송
NotiProcessor notiProcessor = new ANotiProcssor();
//B사노티시스템 발송
NotiProcessor notiProcessor = new NotiProcessorAdapter(new BNotiProcssor());
notiProcessor.doNoti();//노티발송
}
위의 클래스 다이어그램은 아래와 같다.
언제 사용할까?
- 두 클래스가 동일하거나 유사한 작업을 수행하지만 인터페이스가 서로 다른 경우.
- 두 클래스가 공통 인터페이스를 가지면, 클라이언트 코드가 더 간단하고 명료해질 수 있는 경우.
- 외부 라이브러리라서 인터페이스를 바꾸고 싶어도 쉽게 바꿀 수 없는 경우, 또는 인터페이스가 프레임워크의 일부라서 이미 많은 클라이언트에서 사용되고 있는 경우, 또는 소스 코드를 갖고 있지 않는 경우
참고
어댑터 패턴 적용 예제
어댑터 패턴의 개념은 이전 글에서 다루었기 때문에 생략했다. 이전 글 : https://dev-youngjun.tistory.com/210 실무에서는 어떤식으로 어댑터 패턴이 적용되는지 작성했다. 1. 실무 요구사항 메일 발송을
dev-youngjun.tistory.com
어댑터 패턴 (Adapter Pattern) - 기계인간 John Grib
어댑터 패턴 (Adapter Pattern)
서로 일치하지 않는 인터페이스를 가진 클래스를 함께 동작시킨다
johngrib.github.io
'디자인패턴 > 구조' 카테고리의 다른 글
[디자인패턴] 브릿지 패턴 (0) | 2023.04.28 |
---|---|
플라이웨이트(flgweight) 패턴 (0) | 2023.04.05 |
[디자인패턴]컴포지트(composite) 패턴 (0) | 2023.03.22 |
[디자인패턴]데코레이트 패턴 (0) | 2023.03.15 |