개발/디자인패턴

[Java][디자인 패턴] 7. 어댑터 패턴 (Adapter Pattern)

nova_dev 2022. 3. 6. 23:59
반응형

디자인패턴
[Java][디자인 패턴] 7. 어댑터 패턴 (Adapter Pattern)

어댑터 패턴이란 코드를 재사용하기 위해 구조를 변경하는 패턴이다.

 어댑터 패턴이란?

  • 어댑터 패턴은 기존 코드를 재사용하기 위해 내적, 외적 구조를 변환하는 작업을 처리한다.
  • 어댑터 패턴은 코드를 재사용하기 위한 인터페이스를 처리하고 인터페이스를 활용해 보정 코드를 사용한다.
  • 어댑터 패턴은 기능상 문제없이 동작하는 코드가 단지 인터페이스 차이 때문에 사용할 수 없는 경우 많이 응용되는 패턴이다. 또 기존 코드에 오류가 있거나 보정 작업이 필요한 경우에도 유용하다.
  • 어댑터 패턴은 오래된 레거시 코드나 라이브러리를 재사용할 때 유용한 패턴이다. 또한 어댑터 패턴은 서로 호환되지 않는 인터페이스를 가진 코드를 결함 하여 응용 프로그램에서 동작할 수 있도록 도와준다.

 어댑터 패턴 구조

어댑터 패턴

동작은 정상적으로 하지만 오래된 인터페이스를 지닌 RGB를 HDMI로 변환해야 하는 케이스를 생각해보자.
우리는 HDMIConverter라는 어댑터 클래스를 이용해서 인터페이스 규격을 변경하여 사용할 수 있다.

 어댑터 패턴 코드

1.RGB, HDMI 클래스

public class RGB {
    private byte[] images;

    public byte[] getImages() {
        return images;
    }

    public void setImages(byte[] images) {
        this.images = images;
    }
}
public class HDMI {
    private byte[] images;

    public HDMI(byte[] images) {
        this.images = images;
    }

    public byte[] getImages() {
        return images;
    }

    public void setImages(byte[] images) {
        this.images = images;
    }
}

2. Adpater 인터페이스

public interface Adapter {
    HDMI convertRGBToHDMI(RGB rgb);
}

3. Adapter를 구현한 HDMIConverter 클래스
오래된 RGB 클래스를 HDMI로 변환해준다.

public class HDMIConverter implements Adapter {
    @Override
    public HDMI convertRGBToHDMI(RGB rgb) {
        return new HDMI(rgb.getImages());
    }
}

3.Adapter 테스트 코드

class HDMIConverterTest {
    @Test
    void converterTest() {
        // given
        byte[] imageBytes = "변환할 이미지 정보의 스트림".getBytes(StandardCharsets.UTF_8);
        RGB rgb = new RGB();
        rgb.setImages(imageBytes);

        // when
        HDMIConverter hdmiConverter = new HDMIConverter();
        HDMI hdmi = hdmiConverter.convertRGBToHDMI(rgb);

        // then
        assertEquals(hdmi.getImages(), imageBytes);
    }
}

 어댑터 패턴의 장점과 단점

장점

  • 어댑터 패턴은 구조 패턴 중 하나로 기존 클래스를 감싼 새로운 클래스를 생성한다. 그리고 새로운 클래스로 객체의 인터페이스를 재구성한다.
  • 객체를 구성으로 결합하면 느슨한 연결 방식으로 보다 많은 유연성을 확보할 수 있다. 그리고 구성은 프로그램이 실행되는 도중에도 객체를 변경할 수 있다.
  • 어댑터는 복잡한 객체 구조를 깔끔하게 정리하는 데 유용하다.

단점

  • 객체를 구성으로 결합하면 어댑터는 클라이언트에서 사용하는 인터페이스 방식으로 메서드를 새로 생성한다. 어댑터가 새로운 메서드를 재구성할 때 추가 코드가 필요하다.
  • 프로젝트에서 어댑터 패턴을 적용한다고 코드의 성능이 개선되지는 않는다. 오히려 어댑터를 통해야 하므로 속도가 저하된다.

 Github 코드

Github 예제 코드 링크

Github 예제 테스트 코드 링크

참고 자료

 

 

 

 

 

반응형