본문 바로가기
Object-Oriented Programming/Design Pattern

Adapter Pattern, 어댑터 패턴

by yongmin.Lee 2022. 7. 29.

Adapter Pattern

  • 정의
    • 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환
    • 클라이언트가 기대하는 인터페이스 형태로 적응(adapt) 시킬수 있다.
    • Adapter 패턴을 이용해 기존 코드를 가능한 적게 변경하면서 새로운 라이브러리로 교체할 수 있다.
  • 어댑터패턴 요소
    • Target : 클라이언트가 기대하는 인터페이스
    • Adaptee : Target 인터페이스와 일치하지 않는 기존의 다른 인터페이스 또는 객체
    • Adapter : Target을 구현하면서 Adaptee를 감싸 두 인터페이스의 호환성을 연결해주는 클래스 

 

Adapter Pattern 적용 예시

1. adapter pattern 적용 전

// DoubleLinkedList 이미 개발이 완료되었고 수정하기 곤란한 상황
class DoubleLinkedList<T> {
    /* 생략 */
    func insertHead(value : T) { ... }
    func insertTail(value : T) { ... }
    func removeHead() -> T? { ... }
    func removeTail() -> T? { ... }
    /* 생략 */
}

// 클라이언트가 사용하려는 인터페이스
protocol Stack {
    associatedtype T
    func push(value: T)
    func pop() -> T?
    /* 생략 */
}

2. adapter pattern 적용 후

class DStack<T> : Stack {
    typealias T = T
    let dlist = DoubleLinkedList<T>()
    
    func push(value: T) {
    	dlist.insertTail(value:value)
    }
    
    func pop() -> T? {
    	return dlist.removeTail()
    }
}
  • Target : Stack 인터페이스
  • Adaptee : DoubleLinkedList 객체
  • Adapter : DStack 객체
  • Adaptee를 다음과 같이 Adapter에 집어넣어서 클라이언트는 Target 인터페이스로 사용할 수 있다.

 

 

 

 

 

 

참고

https://ko.wikipedia.org/wiki/%EC%96%B4%EB%8C%91%ED%84%B0_%ED%8C%A8%ED%84%B4

https://johngrib.github.io/wiki/pattern/adapter/