어댑터 패턴 (Adapter Pattern)
: 클래스와 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴
호환성이 없는 인터페이스때문에 함께 동작할수 없는 클래스들을 연관관계로 연결하여 사용하는 패턴
객체지향 프로그래밍의 5가지 설계원칙 중 개방 폐쇄의 원칙(OCP)을 잘 지킨 패턴입니다.
어댑터 패턴 적용 사례
1. 외부 라이브러리(Auth, Payment, Media…)
로그인 서비스나, 결제 시스템, 비디오 플레이어 같은 라이브러리를 사용중 일 때, 라이브러리가 더 이상 현재 시스템 요구사항에 맞지 않아서 코드를 바꾸던지 업데이트를 해야 할 때가 있습니다.
이런 외부 라이브러리들은 종종 class 나 interface에 직접 접근할 수 없는 상황이 생깁니다.
그럴 경우 중간에 adapter class를 생성해서 중간에 작업을 변환해 줄 수 있습니다.
2. 레거시 시스템 부분 확장
기존의 시스템의 코드를 부분적으로 확장해야 하는 상황에서 interface나 class 같은 부분이 앱 전역에서 사용되는 비중이 굉장히 커서 바꾸는 비용이 커질 경우가 있습니다.
전체적으로 시스템을 갈아엎기 보다는 adapter class를 부분적으로 만들어주고 중간 중간에 호환이 안되는 부분만 연결시켜서 사용할 수 있습니다.
어댑터 패턴 구성 예시
인터페이스
public interface E110V {
void power();
}
public interface E220V {
void connect();
}
클래스
public class HairDryer implements E110V {
@Override
public void power() {
System.out.println("헤어 드라이어 110V");
}
}
public class Cleaner implements E220V {
@Override
public void connect() {
System.out.println("청소기 220V");
}
}
어댑터 클래스
/**
* 110V로 변환해주는 어댑터이므로 110V의 인터페이스 상속
*/
public class EAdapter implements E110V {
private E220V e220V;
public EAdapter(E220V e220V){
this.e220V = e220V;
}
@Override
public void power() {
e220V.connect();
}
}
메인 클래스
public class AdapterMain {
public static void main(String[] args) {
/** 110V */
HairDryer h1 = new HairDryer();
connect(h1);
/** 220V -> 110V 로 변환하기 위한 어댑터 사용 */
Cleaner c1 = new Cleaner();
E110V adapter1 = new EAdapter(c1);
connect(adapter1);
}
/**
* 110V로 연결되는 메소드
* @param e110V
*/
public static void connect(E110V e110V){
e110V.power();
}
}
참조
'Spring > 0. Design Pattern' 카테고리의 다른 글
5. 옵저버 패턴(Observer Pattern) (0) | 2024.06.14 |
---|---|
4. 팩토리 메소드 패턴(Factory method pattern) (0) | 2024.06.03 |
3. 프록시 패턴(Proxy Pattern) (0) | 2024.05.27 |
1. 싱글톤 패턴(Singleton Pattern)과 멀티스레드 환경의 싱글톤 패턴 (0) | 2022.08.01 |