-
[Design Pattern] 어댑터 패턴 (Adapter Pattern)공부/디자인 패턴 2020. 2. 29. 22:38
어댑터 패턴이란?
한 클래스의 인터페이스를 다른 클래스에서 사용하고자 할 때, 다른 클래스에서 사용할 수 있도록 호환성을 제공해주는 패턴입니다. 예를 들어, 한국에서는 220v가 표준이지만 일본은 110v가 표준입니다. 한국에서 사용하는 충전기를 일본에 가져가면 콘센트의 모양이 맞지 않아 충전을 할 수 없습니다. 이 때, 돼지코와 같은 변환기(어댑터)를 사용해 한국에서 가져온 충전기를 일본에서 충전할 수 있도록 하는 기능이 여기서 말하는 어댑터 패턴이라 볼 수 있습니다.
예시
아래와 같이 한국전자제품 인터페이스와 삼성 클래스가 있다고 구현합니다.
public interface KoreaElectronicProduct { public void 220v(); public void electricPressure(); } public class Samsung implements KoreaElectronicProduct { @Override public void 220v() { System.out.println("220v"); } @Override public void electricPressure() { System.out.println("electricPressure 220v"); } }
다음은 일본전자제품 인터페이스와 닌텐도 클래스가 있다고 구현합니다.
public interface JapanElectronicProduct { public void 110v(); public void electricPressure(); } public class Nintendo implements JapanElectronicProduct { @Override public void 110v() { System.out.println("110v"); } @Override public void electricPressure() { System.out.println("electricPressure 110v"); } }
여기서 삼성 클래스에 일본 전자제품 인터페이스를 붙이려 하면 사용하고 있던 인터페이스 형태가 다르기 때문에 바로 사용할 수 없습니다. 따라서 아래와 같이 어댑터를 만들어 사용해야 합니다.
public class SamsungyAdapter implements JapanElectronicProduct { Samsung samsung; public SamsungyAdapter(Samsung samsung) { this.samsung = samsung; } @Override public void 110v(){ samsung.220v(); } @Override public void electricPressure() { samsung.electricPressure(); } } public class DuckTestDrive { public static void main(String[] args) { Nintendo nintendo = new Nintendo(); Samsung samsungKorea = new Samsung(); JapanElectronicProduct samsungAdapter = new SamsungyAdapter(samsungKorea); samsungAdapter.110v() // 220v samsungKorea.220v() // 220v nintendo.110v() // 110 } }
어댑터는 클래스 어댑터와 객체 어댑터 두 가지가 있는데 클래스 어댑터는 다중상속이 필요한 형태입니다. 자바에서는 다중 상속이 지원되지 않으므로 위와 같은 형태로 어댑터 패턴을 구현할 수 있습니다.