
저번 구조 패턴 (1)에 이어 작성..
특정 클래스의 인터페이스를 다른 인터페이스로 변환하여 다른 클래스가 사용할 수 있도록 하는 패턴
호환되지 않는 인터페이스를 연결해주는 역할
즉, 기존 코드를 수정하지 않고 중간에 연결 다리(어댑터)를 둬서 다른 인터페이스를 사용할 수 있도록 도와줌

Target Interface)와 일본의 110v(Adaptee, 기존에 호환되지 않는 클래스) 를 호환시키기 위한 어댑터한국과 일본의 서로 호환되지 않는 클래스 정의
public interface KoreanPlug {
void provideElectricity();
}
public class JapanPlug {
public void sendElectricity(){
System.out.println("Japan 110V");
}
}
어댑터를 사용하여 Target과 Adaptee 코드의 수정 없이 두 클래스가 호환될 수 있도록 설정
public class JapanToKoreaPlug implements KoreanPlug{
private JapanPlug japanPlug;
public JapanToKoreaPlug(JapanPlug japanPlug){
this.japanPlug = japanPlug;
}
@Override
public void provideElectricity() {
System.out.println("Converting...");
japanPlug.sendElectricity();
}
}
KoreanPlug(200V)를 사용하고 있지만 실제로는 JapanPlug(110V)를 변환하여 사용
public class PlugMain {
public static void main(String[] args) {
JapanPlug japanPlug = new JapanPlug();
KoreanPlug koreanPlug = new JapanToKoreaPlug(japanPlug);
koreanPlug.provideElectricity();
}
}
/*
Converting...
Japan 110V
*/
기존 클래스를 건드리지 않고 재사용
클라이언트는 Target Interface(KoreanPlug)만 보고 동작
구조적 유연성 제공
기존 시스템을 유지하면서 새로운 구성요소 통합
객체 어댑터, 클래스 어댑터가 존재
객체 어댑터는 '합성', 클래스 어댑터는 '상속' 의 방식을 사용
(합성 : 하나의 객체가 다른 객체의 필드로 포함하여, 그 객체의 기능을 재사용하거나 위임하는 구조적 개념)
만약 클래스 어댑터로 변경한다면?
// Java는 단일 상속만 가능하므로, 이 방식은 Adaptee가 클래스여야 함
public class JapanToKoreaClassAdapter extends JapanPlug implements KoreaPlug {
@Override
public void provideElectricity() {
System.out.println("Converting...");
sendElectric(); // 부모 클래스 메서드 호출
}
}
public class Main {
public static void main(String[] args) {
KoreaPlug plug = new JapanToKoreaClassAdapter();
plug.provideElectricity();
}
}
클래스 어댑터는 제약이 많아 거의 사용하지 않음
즉시 실행 함수를 통해 private, public 같은 접근 제어자를 만드는 패턴
즉시 실행 함수 : 함수를 정의하자마자 바로 호출하는 함수
일반적으로 JavaScript에서 모듈의 공개(public) 인터페이스만 노출, 나머지는 감추는 모듈화 패턴
내부 세부 구현은 숨기고, 필요한 메서드만 공개 API로 노출하는 방식
즉, 정보 은닉과 인터페이스 명확화가 목적
Java의 캡슐화 + 정적 인터페이스 노출 방식으로 유사하게 표현
public class Counter {
// 내부 상태는 private static 으로 은닉
private static int count = 0;
// 외부에 노출할 public 메서드
public static void increment(){
count++;
}
public static int getCount(){
return count;
}
}
public class CounterMain {
public static void main(String[] args) {
Counter.increment();
Counter.increment();
System.out.println(Counter.getCount());
}
}
/*
2
*/
코드 응집성 향상
관련된 기능들을 함께 그룹화하여 노출 -> 응집성 향상
정보 은닉
객체의 상태를 숨기고 특정 함수만을 외부에 노출함으로써 모듈의 안정성을 높임
명시적 API
외부에 명시적으로 노출되는 멤버를 통해 모듈의 공개 API를 명확하게 정의
유연성과 확장성
모듈 내부의 구현을 변경하더라도 외부 인터페이스를 그대로 유지 가능
테스트 용이성
모듈의 내부 상태와 동작을 캡슐화기 때문에, 모듈의 단위 테스트가 더 쉬워짐
https://reveur1996.tistory.com/156
https://www.hanbit.co.kr/channel/view.html?cmscode=CMS8616098823