본문 바로가기
Programming/OOP

[Design Pattern] Adapter Pattern, 어댑터패턴

by TinKerBellBass 2022. 5. 9.
728x90
반응형

어댑터 패턴은 스파이의 냄새가 나는 패턴이다.
본래의 모습을 숨기고 다른 모습으로 살아가는 스파이.
어떤 라이브러리를 수정해서 사용하거나, 새로운 기능을 추가하고 싶지만
그 라이브러리를 수정하기 힘든 상황에 사용할 수 있는데,
수정하고 싶은 라이브러리를 감싸서 새로운 인터페이스를 정의해서 사용한다.

어댑터 패턴은 클래스 어댑터 패턴, 객체 어댑터 패턴이 있는데,
클래스 어댑터 패턴은 다중 상속을 해야 하기 때문에 마음에 들지 않는다.
자바에서는 클래스의 다중 상속을 지원하지 않지만 인터페이스의 다중 상속은 허용하기 때문에 구현은 가능하다.
코드 양이 늘어나는 단점이 있지만 구성을 사용하는 객체 어댑터 패턴이 더 올바르다고 생각한다.

Adapter Pattern

어댑터 패턴의 등장인물은 다음과 같이 4명이 있다.

Target Interface, 타깃 인터페이스 어댑터의 필드에 구성으로 설정되는 감싸지는 대상 인터페이스
Adaptee Interface, 어댑티 인터페이스 타깃 인터페이스가 변환되는 인터페이스
Adapter Class, 어댑터 클래스 타깃 인터페이스를 감싸서 어댑티 인터페이스로 변환하는 클래스
Client, 클라이언트 어댑티 인터페이스, 타깃 인터페이스를 감싼 어댑터 클래스를 사용하는 곳

타깃 인터페이스를 어댑티 인터페이스로 변환해야 하기 때문에
어댑터 클래스는 어댑티 인터페이스를 구현해야 하고,
타깃 인터페이스를 구성 요소로 필드에 설정해야 한다.
어댑티 인터페이스의 메서드를 구현할 때 타깃 인터페이스의 메서드로 구현이 가능한 경우,
타깃 인터페이스의 메서드로 구현하고,
구현이 불가능한 경우 에러를 반환하거나 직접 새롭게 메서드를 구현한다.
그리고 새로운 기능을 추가하고 싶은 경우도 직접 메서드를 새롭게 구현한다.

Adapter Pattern Class Diagram

AdapterTest 클래스는 ExchangeRateV2 어댑티 인터페이스를 사용하는 클라이언트이다.
클라이언트는 ExchangeRateV2 인터페이스를 구현한 다음의 두 구상 클래스를 사용할 수 있다.

  • ExchangeRateV2 를 직접 구현한 ExchangeRateV2Repository 구상 클래스
  • 타깃 인터페이스인 ExchangeRateV1 인터페이스를 구성을 통해 필드에 가지며 ExchangeRateV2 를 구현한 ExchageRateV1Adapter 클래스

클라이언트는 ExchangeRateV2 인터페이스에 공개되어 있는 getExchangeRate 메서드를 통해
환율 정보를 가져온다는 것만 알고 있고,
어댑터 클래스가 ExchangeRateV1 인터페이스를 변환하고 있다는 것은 알지 못한다.
변환하는 구현이 캡슐화되어 숨겨져 있기 때문이다.
이렇게 인터페이스를 두면 숨기고 싶은 사실을 캡슐화해서 숨길 수 있다.

그리고 ExchangeRateV2Repository, ExchangeRateV1Repository 두 클래스는 어댑터 패턴과 연관은 없지만
인터페이스를 구현한 클래스가 없다는 게 마음에 들지 않아서 간단히 구현하였다.
전체 소스는 https://github.com/Jongwon-Hyun/design_pattern

 

Adpater Pattern Vs. Decorator Pattern

어댑터 패턴과 데코레이터 패턴 둘 다 구성을 통해 가지고 있는 객체를 감싸다는 점에서는 일치하지만,
데코레이터 패턴은 단지 기능을 추가할 뿐이고, 어댑터 패턴은 인터페이스 자체를 바꿔버리는 차이점이 있다.
코드 레벨에서 보면
데코레이터 패턴은 감싸는 대상 인터페이스를 구현하고, 또 그 대상 인터페이스를 구성으로 가지고 있지만,
어댑터 패턴은 변환하는 인터페이스를 구현하고, 감싸는 대상 인터페이스를 구성으로 가지고 있다.
즉 데코레이터 패턴은 구현하는 인터페이스와 구성으로 가지고 있는 인터페이스가 동일하지만,
어댑터 패턴은 동일하지 않다.

728x90
반응형

댓글