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/
'Object-Oriented Programming > Design Pattern' 카테고리의 다른 글
Observer Pattern, 옵저버 패턴 (0) | 2022.08.08 |
---|---|
State Pattern, 상태패턴 (0) | 2022.08.02 |
Composite Pattern, 컴포지트 패턴 (0) | 2022.07.28 |
Decorator Pattern, 데코레이터 패턴 (0) | 2022.07.19 |
Proxy pattern, 프록시패턴 (0) | 2022.07.19 |