본문 바로가기
디자인패턴/구조

[디자인패턴] 어댑터 패턴

by se0nghyun2 2023. 3. 23.
더보기

구조패턴 : 클래스나 객체를 상속과 합성을 통하여 더 큰 구조를 만드는 패턴

어댑터 패턴

서로 관계가 없는 인터페이스들을 어댑터 객체를 두어 함께 사용할 수 있도록 하는 패턴

 

어댑터패턴 구조


상황예시)
 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();//노티발송
    }

 

위의 클래스 다이어그램은 아래와 같다.


언제 사용할까?

  • 두 클래스가 동일하거나 유사한 작업을 수행하지만 인터페이스가 서로 다른 경우.
  • 두 클래스가 공통 인터페이스를 가지면, 클라이언트 코드가 더 간단하고 명료해질 수 있는 경우.
  • 외부 라이브러리라서 인터페이스를 바꾸고 싶어도 쉽게 바꿀 수 없는 경우, 또는 인터페이스가 프레임워크의 일부라서 이미 많은 클라이언트에서 사용되고 있는 경우, 또는 소스 코드를 갖고 있지 않는 경우

참고

어댑터 패턴 적용 예제 (tistory.com)

 

어댑터 패턴 적용 예제

어댑터 패턴의 개념은 이전 글에서 다루었기 때문에 생략했다. 이전 글 : https://dev-youngjun.tistory.com/210 실무에서는 어떤식으로 어댑터 패턴이 적용되는지 작성했다. 1. 실무 요구사항 메일 발송을

dev-youngjun.tistory.com

 

어댑터 패턴 (Adapter Pattern) - 기계인간 John Grib

 

어댑터 패턴 (Adapter Pattern)

서로 일치하지 않는 인터페이스를 가진 클래스를 함께 동작시킨다

johngrib.github.io