본문 바로가기

용어정리/#디자인패턴

용어정리-[#디자인 패턴] 1.Adapter Pattern

[ Adapter Pattren ]

어댑터 패턴


2018 - 06 - 01


어댑터를 번역하면 변환기(converter) 라고 할 수 있다.


변환기의 역할은 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것이다.


데이터베이스 관련 프로그램을 작성해 봤다면 

다양한 데이터베이스 시스템을 공통의 인터페이스인

ODBC나 JDBC를 이용해 조작할 수 있다는 사실을 알고 있을 것이다.


바로 ODBC나 JDBC가 어댑터 패턴을 이용해 다양한 데이터베이스 시스템을

단일한 인터페이스로 조작할 수 있게 해주기 때문이다.


다음은 어댑터 패턴이 적용되지 않은 코드이다.


ServiceA.java

1
2
3
4
5
6
7
package adapterPattern;
 
public class serciceA {
    void runServiceA() {
        System.out.println("ServiceA");
    }
}
cs








ServiceB.java

1
2
3
4
5
6
7
package adapterPattern;
 
public class ServiceB{
    void runServiceB(){
        System.out.println("ServiceB");
    }
}
cs


ClientWithNoAdapter.java

1
2
3
4
5
6
7
8
9
10
11
package adapterPattern;
 
public class ClientWithNoAdapter {
    public static void main(String[] args){
        ServiceA sa1 = new ServiceA();
        ServiceB sb1 = new ServiceB();
 
        sa1.runServiceA();
        sb1.runServiceB();
    }
}
cs


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

ServiceA를 위한 변환기 AdapterServiceA.java

1
2
3
4
5
6
7
8
9
package adapterPattern;
 
public class AdapterServiceA {
    ServiceA sa1 = new ServiceA();
 
    void runService(){
        sa1.runService();
    }
}
cs

ServiceB를 위한 변환기 AdapterServiceB.java
1
2
3
4
5
6
7
8
9
package adapterPattern;
 
public class AdapterServiceB {
    ServiceB sb1 = new ServiceB();
 
    void runService(){
        sb1.runService();
    }
}
cs


예제들을 보면 기존의 ServiceA와 ServiceB의 메서드를 Service()라고 하는 같은 이름의 메서드로 호출해서 사용할 수 있게 해주는 변환기이다. 이제 ClientWithAdapter라는 클래스를 추가하고 main() 메서드에서 이 변환기들을 사용해 보자


어댑터 패턴을 사용하는 ClientWithAdapter.java
1
2
3
4
5
6
7
8
9
10
11
package adapterPattern;
 
public class ClientWithAdapter {
    public static void main(String[] args){
        AdapterServiceA asa1 = new AdapterServiceA();
        AdapterServiceB asb1 = new AdapterServiceB();
 
        asa1.runService();
        asb1.runService();
    }
}
cs



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

어댑터 패턴은 합성. 즉 객체를 속성으로 만들어서 참조하는 디자인 패턴으로,
한 문장으로 정리하면 다음과 같다.

"호출당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록
 중간에 변환기를 통해 호출하는 패턴"

출처

스프링 입문을 위한 자바 객체 지향의 원리와 이해

김종민 지음