[디자인패턴] Adapter Pattern, 어댑터 패턴

Chloe Choi·2021년 1월 31일
0

디자인패턴

목록 보기
3/11

AdapterPattern 설명

Why

  • 이미 구현된 무언가를 사용해야하는데 현재 개발 요구사항과 인터페이스가 맞지 않는다.
  • 혹은, 여러 video player가 있다. 모든 플레이어들은 play, pause, playback 등 유사항 기능을 제공하지만 완전 동일한 인터페이스를 제공하진 않는다.
    모든 타입의 video player와 interact하는 SW를 개발해야 한다.

How

  • Adapter라는 클래스를 둬 이미 구현된 것을 wrap해 인터페이스를 맞춘다.
  • common VideoPlayerController Interface를 정의해 각각에 맞는 구현(Adapter)을 한다.
    -> Client는 정확히 어떤 video player를 control하는지 몰라도 됨!

첫번째 문제만으로 Adapter Pattern의 필요성은 충분히 알 수 있지만 좀 더 효과적으로 전달하기 위해 두번째 문제도 추가했다! 두번째 문제 같은 경우에는 팩토리 패턴을 같이 사용하면 지옥의 switch/case문을 계속 사용하는것보다 효율적으로 코드를 짤 수 있다!

What

Adapter Pattern이란,

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하는 패턴이다. 따라서, 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용 가능하다.

AdapterPattern_pic1

실제 사용케이스

Java를 이용해 개발할 때 입력 시 다음 코드를 많이 사용했을거다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

이 코드를 좀 더 자세히 보자.

  • System.in: bytes stream으로 데이터를 읽어옴
  • BufferedReader: character stream으로 데이터를 읽어옴

헉 System.in이 실제로 제공하는 것과 BufferedReader가 기대하는 값이 다른데 이를 어떻게 해결할까?
-> Adapter를 둬 해결했다 !

InputStreamReader가 바로 그 어댑터 역할을 한다. 해당 클래스 코드에서 다음과 같은 주석이 달려있다. "An InputStreamReader is a bridge from byte streams to character streams." 또, 구현된 코드를 보면 Adaptee인 System.in을 wrap하고 있는걸 확인할 수 있다!

public InputStreamReader(InputStream in) {
    super(in);
    try {
        sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
    } catch (UnsupportedEncodingException e) {
        // The default encoding should always be available
        throw new Error(e);
    }
}

ref.

https://beomseok95.tistory.com/253

profile
똑딱똑딱

0개의 댓글