[6단원]디자인 패턴 - 어댑터 패턴

어댑터 패턴

  • 서로 다른 두 인터페이스가 함께 동작할 수 있도록 중개역할하는 디자인 패턴
  • 변환기 or 중개자 역할
  • OOP 원칙 중 하나인 OCP ( 개방 - 폐쇄 원칙 ) 을 따른다.

일상생활 예시 : 충전기

  • 충전기
    • 휴대폰 ↔ 전원 콘센트 사이 어댑터 역할
  • 휴대폰과 전원 콘센트
    • 서로 다른 인터페이스
    • 충전기가 연결을 가능하게함.

프로그래밍 예시 : JDBC ODBC

  • JDBC ( Java Database Connectivity )
  • ODBC ( Open Database Connectivity )

는 여러 다른 데이터베이스 시스템 통일된 인터페이스 제공

어댑터 패턴 → 개방 폐쇄 원칙

  • JDBC 와 JRE 는 기존 시스템에 영향을 주지 않고, 다양한 DB 와 플랫폼에 쉽게 적용가능

코드 예시 : 어댑터가 적용되지 않음

public class ServiceA {
    void runServiceA() {
        System.out.println("ServiceA");
    }
}
public class ServiceB {
    void runServiceB() {
        System.out.println("ServiceB");
    }
}
public class ClientWithNoAdapter {
    public static void main(String[] args) {
        ServiceA sa1 = new ServiceA();
        ServiceB sb1 = new ServiceB();
        
        sa1.runServiceA();
        sb1.runServiceB();
    }
}
  • 어댑터 패턴이 적용 X
  • 아래는 어댑터 패턴이 적용되지 않은 시퀀스 다이어그램이다.
  • runServiceA 와 runServiceB 는 비슷한 일을 하지만, 메서드명이 다르다.
  • 그러면 어댑터 패턴을 적용하면 어떻게 될까?
public class AdapterServiceA {
    ServiceA sa1 = new ServiceA();
    
    void runService() {
        sa1.runServiceA();
    }
    
}
public class AdapterServiceB {
    ServiceB sb1 = new ServiceB();
    
    void runService() {
        sb1.runServiceB();
    }
    
}
  • ServiceA 와 ServiceB 메서드는 runService() 라고 하는 같은 이름의 메서드로 호출가능
  • Main 메서드에서 사용해보자
public class ClientWithAdapter {
    public static void main(String[] args) {
        
        AdapterServiceA asa1 = new AdapterServiceA();
        AdapterServiceB asb1 = new AdapterServiceB();
        
        asa1.runService();
        asb1.runService();
    }
}
  • runService() 라는 동일한 메서드를 통해 두 개의 서비스를 호출 가능

핵심

  • 객체를 속성으로 만들어 참조하는 디자인 패턴
  • AdapterServiceA 클래스에서 ServiceA 객체를 속성으로 가지며
  • 그 객체의 메서드를 내부에서 호출
  • 이를 합성 이라함.

이걸 왜 씀?

  • 호출당하는 쪽의 메서드를 호출하는 쪽의 코드에 대응하도록
  • 중간에 변환기를 통해 호출
  • 두 개의 다른 서비스가 있는 경우 일관된 방식으로 접근하고 싶은 경우


Uploaded by N2T