[구조패턴] Adapter 패턴

Updated: Categories:

Adapter 패턴에 대해 알아보자

그게 뭐야 ❓

  • 기존 시스템에서 사용하던 인터페이스가 있을 때, 호환되지 않는 새로운 인터페이스를 사용해야할 때 사용한다.
    ex) 220V 를 사용하는 한국에서 쓰던 기기들을 어댑터를 사용해 110V 를 쓰는곳에 가서도 그대로 쓸 수 있는 것처럼
  • 호환을 위해 기존 인터페이스를 수정하지 않고 Adapter라는 클래스를 추가해 문제를 해결한다.


클래스 다이어그램

  • 이것만 보고는 무슨 소리인지 도통 모르겠다
  • 예시 코드를 만들어서 구조를 눈으로 직접 확인해보자.


문제상황

  • 음악 파일을 플레이시켜주는 시스템이 있다고 해보자~
  • 현재 시스템에서는 WAV 확장자 파일만을 플레이할 수 있는 플레이어밖에 없음
  • 이 시스템에서 MP3, MP4 등의 확장자 파일도 플레이할 수 있게 만드려고 한다
  • Adapter 패턴을 적용하여 코드 수정없이 구현해보자!


기존 시스템


변경된 시스템


  • 추가하려는 확장자는 기존 시스템에서 사용하던 Player와 호환되지 않아(인터페이스가 다름) Adapter 클래스가 필요하다.
  • 따라서 기존 Player 인터페이스를 상속받는 Adapter 클래스를 만들고,
    기존 play 메소드에 OtherPlyer 인터페이스를 사용하여 오버라이딩한다.
  • 이렇게 구현하면 Main 클래스에서 기존 player 객체만으로 WAV, MP3, MP4 모두 플레이가 가능하다.


추가 정보

  • Arrays.asList() 메소드에서 어댑터 패턴을 사용한다고 함 😇

장점

  • 메인코드에서 기존 인터페이스를 그대로 사용할 수 있어 많은 수정을 방지할 수 있다! (OCP 원칙)

단점

  • 찾아보니 어댑터 클래스에서 통일 시켜주는 부분을 하나씩 구현해야 하는게 단점이라고 하는데(당연한거 아닌가?) 딱히 없는것 같다…


참고링크

  • https://refactoring.guru/design-patterns/adapter
  • https://niceman.tistory.com/141