리셋 되지 말자

어댑터 패턴(Adapter Pattern) 본문

Java(폐지)/디자인 패턴

어댑터 패턴(Adapter Pattern)

kyeongjun-dev 2020. 7. 21. 16:35

어댑터를 번역하면 변환기(converter)라고 할 수 있다. 변환기의 역할은 서로 다른 두 인터페이스 사이에 통신이 가능하게 하는 것이다.(ex 플러그 전원과 핸드폰을 연결해주는 충전기-충전기가 변환기의 역할을 수행)

ODBC/JDBC가 어댑터 패턴을 이용해 다양한 데이터베이스 시스템을 단일한 인터페이스로 조작할 수 있게 한다.

JRE 또한 어댑터 패턴이다.

결국 어댑터 패턴은 개방 폐쇄 원칙(OCP)를 활용한 설계 패턴이라고 할 수 있다.

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

  • ServiceA.java
package adapterPattern;

public class ServiceA {
    void runServiceA() {
        System.out.println("ServiceA");
    }
}
  • ServiceB.java
package adapterPattern;

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

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

        sa1.runServiceA();
        sb1.runServiceB();
    }
}
  • main() 메서드를 살펴보면 sa1 참조 변수와 ssb1 참조 변수를 통해서 호출하는 각 메서드가 비슷한 일을 하지만 메서드명이 다른 것을 볼 수 있다.

어댑터 패턴이 적용된 코드

어댑터 패턴을 적용해 메서드명을 통일한다.
ServiceA에 대한 변환기와 ServiceB에 대한 변환기를 추가한다.

  • AdapterServiceA
package adapterPattern;

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

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

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

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

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

        asa1.runService();
        asb1.runService();
    }
}
  • ClientWithAdapter에서 변환기를 통해 service()라는 동일한 메서드명으로 두 객체의 메서드를 호출하는 것을 볼 수 있다.(변환기들이 인터페이스를 구현하게 해서 더 개선할 수도 있음.)

정리


어댑터 패턴은 합성, 즉 객체를 속성으로 만들어서 참조하는 디자인 패턴이다.
"호출당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록 중간에 변환기를 통해 호출하는 패턴"

잘 모르겠지? 여기 참고해라 나 자신아 https://niceman.tistory.com/141 https://gdtbgl93.tistory.com/141

어댑터 패턴의 강점


기존 클래스의 소스 코드를 전혀 수정하지 않고 타겟 인터페이스 맞게 동작하도록 한다!

Comments