어댑터 패턴
- 서로 다른 두 인터페이스가 함께 동작할 수 있도록 중개역할하는 디자인 패턴
변환기
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
'자바 > 스프링입문객체지향' 카테고리의 다른 글
[6단원]디자인 패턴 - 템플릿 메서드 패턴 ( Template Method Pattern) (0) | 2023.09.21 |
---|---|
[6단원]디자인 패턴 - 개요 (0) | 2023.09.15 |
[6단원]디자인 패턴 - 프록시 패턴 (0) | 2023.09.15 |
[6단원]디자인 패턴 - 데코레이터 패턴 (Decorator Pattern) (0) | 2023.09.15 |
[5단원]5원칙 - LSP (0) | 2023.09.13 |