| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- 논문 정리
- 경로 계획 알고리즘
- 생성 패턴
- 커머스
- Go-lang
- 14일 공부
- study
- MAPF
- 디자인 패턴
- 청첩장 모임
- 신혼 여행
- amazon ecs
- AWS
- docker
- 오블완
- ssh
- 토스
- 지표
- Til
- DevOps
- AWS 비용 절감
- 실용주의 프로그래머
- PostgreSQL
- Playwright
- terraform
- leetcode
- Rust
- 구조 패턴
- 티스토리챌린지
- github
- Today
- Total
밤 늦게까지 여는 카페
[디자인 패턴] 어답터(Adapter) 패턴이란 본문
오늘 공부할 디자인 패턴은 어답터 패턴입니다.
1. 어답터 패턴이란
어답터 패턴은 한 단어로 "Wrapper"입니다. "API로 제공되는 데이터와 우리 데이터 모델이 다른 부분이 많아. Wrapper 함수(Wrapper 서비스)를 구현해야겠어." 서드파티 라이브러리나 서비스를 이용하면 흔히 들을 수 있는 말입니다. 이렇게 일치하지 않는 인터페이스를 맞추기 위해서 내가 만든 컴퍼넌트로 한단계 감싸주는 접근 방식을 어답터 패턴이라고 합니다.
메소드, 클래스, 서비스 등 다양한 적용 방식이 있겠지만 이번 포스팅에서는 간단하게 클래스에 어답터 패턴을 적용하는 예시를 들어보겠습니다.
2. 활용하기 좋은 순간
- 기존 클래스를 재사용하고 싶은데 인터페이스가 맞지 않을 때(특히, 인터페이스를 맞추기 위한 개발 비용이 너무 클 때)
- 수정할 수 없는 라이브러리나, API를 사용해야만 하는데 인터페이스가 맞지 않을 때
3. 예시
진행 중인 프로젝트에서 사용하던 Car 인터페이스와 유사한 Vehicle 인터페이스가 있습니다. Car 인터페이스와 Vehicle 인터페이스는 유사한 점이 많아서 Car 인터페이스를 상속하는 자식 클래스들을 그대로 Vehicle 인터페이스에 사용하려고 했습니다.
하지만 Vehicle 인터페이스에는 Car 인터페이스에는 없는 change_gear라는 메소드가 있습니다. 이를 어답터 패턴을 이용해서 해결할 것입니다.
3.1 어답터 패턴을 적용하지 않고 직접 수정한 코드와 3.2 어답터 패턴을 적용한 코드를 비교해보시죠!
만약 3.1에서 수정해야 할 클래스가 많았다면 아무 동작도 하지 않는 메소드를 위해서 불필요한 작업에 시간을 너무나도 많이 할애해야 했을 것입니다.
그에 비해 3.2에서는 어답터 클래스를 이용해서 간단하게 인터페이스를 맞출 수 있었습니다.
간단한 예시를 사용했기에 어답터 패턴의 장점이 바로 보였습니다만, 경우에 따라서 어답터 패턴을 구현하는 것이 더 많은 개발 비용을 초래할 수도 있습니다. 이를 고려하면서 다른 구조 패턴들도 공부해보면 상황에 맞는 선택을 할 수 있을 것입니다 :)
3.1 어답터 패턴을 적용하지 않고 직접 수정한 코드
## vehicle.py
from abc import ABCMeta, abstractmethod
class VehicleInterface(metaclass=ABCMeta):
def __init__(self):
self.speed = 0
@abstractmethod
def break(self):
pass
@abstractmethod
def accelerate(self):
pass
@abstractmethod
def change_gear(self):
pass
## car.py
from abc import ABCMeta, abstractmethod
class CarInterface(metaclass=ABCMeta):
def __init__(self):
self.speed = 0
@abstractmethod
def break(self):
pass
@abstractmethod
def accelerate(self):
pass
## k3.py
class K3(CarInterface, Vehicle):
def break(self):
self.speed -= 1
def acclerate(self):
self.speed += 1
def change_gear(self):
pass
## k5.py
class K5(CarInterface, Vehicle):
def break(self):
self.speed -= 2
def acclerate(self):
self.speed += 2
def change_gear(self):
pass
## k8.py
class K8(CarInterface, Vehicle):
def break(self):
self.speed -= 3
def acclerate(self):
self.speed += 3
def change_gear(self):
pass
3.2 적용한 후
## vehicle.py
from abc import ABCMeta, abstractmethod
class VehicleInterface(metaclass=ABCMeta):
def __init__(self):
self.speed = 0
@abstractmethod
def break(self):
pass
@abstractmethod
def accelerate(self):
pass
@abstractmethod
def change_gear(self):
pass
## car.py
from abc import ABCMeta, abstractmethod
class CarInterface(metaclass=ABCMeta):
def __init__(self):
self.speed = 0
@abstractmethod
def break(self):
pass
@abstractmethod
def accelerate(self):
pass
class VehicleAdapter(VehicleInterface):
def __init__(self):
super().__init__()
@abstractmethod
def break(self):
pass
@abstractmethod
def accelerate(self):
pass
def change_gear(self):
pass
## k3.py
class K3(CarInterface, VehicleAdapter):
def break(self):
self.speed -= 1
def acclerate(self):
self.speed += 1
## k5.py
class K5(CarInterface, VehicleAdapter):
def break(self):
self.speed -= 2
def acclerate(self):
self.speed += 2
## k8.py
class K8(CarInterface, VehicleAdapter):
def break(self):
self.speed -= 3
def acclerate(self):
self.speed += 3'디자인 패턴 > 구조 패턴' 카테고리의 다른 글
| [디자인 패턴] 플라이웨이트(flyweight) 패턴이란 (0) | 2022.09.02 |
|---|---|
| [디자인 패턴] 퍼사드(Facade) 패턴이란 (2) | 2022.08.30 |
| [디자인 패턴] 데코레이터(Decorater) 패턴이란 (0) | 2022.08.29 |
| [디자인 패턴] 컴퍼짓(Composite) 패턴이란 (0) | 2022.08.28 |
| [디자인 패턴] 브릿지(Bridge) 패턴이란 (0) | 2022.08.27 |