Java

[Java] 어댑터 패턴(Adapter Pattern)

Hyung1 2021. 2. 8. 19:52
728x90
반응형

어댑터패턴이란?

  • 개체를 속성으로 만들어서 참조하는 디자인 패턴
  • 호출당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 호출하는 패턴
  • 한 클래스의 인터페이스를 클라이언트에서 사용하고자하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다.
  • 개방 폐쇄 원칙을 활용한 설계패턴

데이터베이스 관련 프로그램에서도 어댑터패턴을 볼 수 있다.

시스템을 공통의 인터페이스 ODBC 또는 JDBC를 이용해 조작할 수 있다는 사실을 알고 있을 것이다. 바로 ODBC/JDBC가 어댑터 패턴을 이용해 다양한 데이터베이스 시스템을 단일한 인터페이스로 조작할 수 있게 해주기 때문이다.

 

예제 코드를 통해 어댑터 패턴을 이해해보자. 먼저 어댑터 패턴이 적용되지 않은 코드다.

 

package DesignPattern.adapterPattern;

public class ServiceA {
    void runServiceA() {
        System.out.println("Service");
    }
}
package DesignPattern.adapterPattern;

public class ServiceB {
    void runServiceB() {
        System.out.println("ServiceB");
    }
}
package DesignPattern.adapterPattern;

import java.util.Objects;

public class ClientWithNoAdapter {
    public static void main(String[] args) {
        ServiceA sa1 = new ServiceA();
        ServiceB sb2 = new ServiceB();

        sa1.runServiceA();
        sb2.runServiceB();
    }
}

main() 메서드를 살펴보면 sa1참조 변수와 sb1 참조 변수를 통해 호출하는 각 메서드가 비슷한 역할을 하지만 메서드명이 다른 것을 8번째와 9번째 라인에서 볼 수 있다.

 

아래

그림은 어댑터 패턴을 적용하기전의 시퀀스 다이어그램이다.

 

이제 어댑터 패턴을 적용해 메서드명을 통일해보자. ServiceA에 대한 변환기와 ServiceB에 대한 변환기를 아래처럼 추가한다.

package DesignPattern.adapterPattern;

public class AdapterServiceA {
    ServiceA sa1 = new ServiceA();

    void runService() {
        sa1.runServiceA();
    }
}
package DesignPattern.adapterPattern;

public class AdapterServiceB {
    ServiceB sb1 = new ServiceB();

    void runService() {
        sb1.runServiceB();
    }
}
package DesignPattern.adapterPattern;

public class ClientWithAdapter {
    public static void main(String[] args) {
        AdapterServiceA asa1 = new AdapterServiceA();
        AdapterServiceB asb1 = new AdapterServiceB();

        asa1.runService();
        asb1.runService();
    }
}

어댑터 패턴을 적용한 후의 시퀀스 다이어그램

클라이언트가 변환기를 통해 runService()라는 동일한 메서드명으로 두 객체의 메서드를 호출하는 것을 볼 수 있다. 

 

출처 :

www.aladin.co.kr/shop/wproduct.aspx?ItemId=55641908

728x90
반응형