일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- python 릿코드
- 파이썬 알고리즘 풀기
- 코틀린기초
- 릿코드풀기
- 파이썬 릿코드
- 파이썬 프로그래머스
- 파이썬알고리즘풀기
- 알고리즘풀이
- 파이썬릿코드풀기
- python 알고리즘
- python sorted
- 릿코드
- 상가수익률계산기
- 알고리즘풀기
- python zip_longest
- 파이썬릿코드
- binary search
- 릿코드풀이
- leetcode풀기
- 잇츠디모
- 파이썬 알고리즘
- 파이썬알고리즘
- LeetCode
- 릿코드 풀기
- python Leetcode
- leetcode풀이
- leetcode 풀기
- python xor
- 릿코드 파이썬
- python priority queue
- Today
- Total
소프트웨어에 대한 모든 것
[디자인패턴][Adapter] 어댑터 패턴 본문
어댑터 패턴 정의
- 호환성이 없는 기존 클래스의 인터페이스를 변환하여 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴
- 코드의 재활용성을 증가하고 기존의 코드를 수정하지 않는 장점이 있음
어댑터 패턴 언제 사용?
- 외부 구성 요소를 기존 시스템에 재사용하고 싶지만 호환되지 않는 경우
- 애플리케이션이 클라이언트가 기대하는 인터페이스와 호환되지 않는 경우
- 원본 코드를 수정하지 않고 애플리케이션에서 레거시 코드를 재사용하려는 경우
어댑터 패턴 클래스 다이어그램
어댑터 패턴 활용
기존 시스템에 Fighter 인터페이스가 있고 이를 상속 받은 Warrior 클래스가 있습니다. attack(), defend(), escape() 오퍼레이션을 지원합니다. 외부에서 Wizard(마법사) 클래스는 이미 만들어져 있었습니다. 이를 기존의 Fighter와 동일한 인터페이스로 사용하기 위해서 어댑터 패턴을 적용합니다.
Fighter 클래스를 상속받은 WizardAdapter 클래스를 하나 생성하고 WizardAdapter를 Wizard를 멤버 변수로 갖습니다. Fighter의 attack(), defend(), escape()가 호출되면 Wizard의 shot_fire_ball(), shield(), portral()을 호출하면 됩니다. Wizard 클래스가 추가가 되었지만 코드의 변경없이 WizardAdapter 클래스를 추가 함으로서 기존 시스템 동일한 인터페이스로 Wizard를 사용할 수 있게 되었습니다. 객체 지향 5대 원칙 중 OCP(개방폐쇄원칙)을 충실히 따른 것이라 할 수 있습니다.
from abc import ABC, abstractmethod
class Fighter(ABC):
@abstractmethod
def attack(self): pass
@abstractmethod
def defend(self): pass
@abstractmethod
def escape(self): pass
class Warrior(Fighter):
def attack(self):
print('칼을 휘두르다')
def defend(self):
print('방패를 들어올니다')
def escape(self):
print('뒤로 물러난다')
class WizardAdapter(Fighter):
def __init__(self, wizard):
self.wizard = wizard
def attack(self):
self.wizard.shot_fire_ball()
def defend(self):
self.wizard.shield()
def escape(self):
self.wizard.portal()
class Wizard:
def shot_fire_ball(self):
print('파이어볼 발사')
def shield(self):
print('주변에 보호막 씌우기')
def portal(self):
print('포탈 열고 이동')
wizard = WizardAdapter(Wizard())
wizard.attack()
wizard.defend()
wizard.escape()
출력
파이어볼 발사
주변에 보호막 씌우기
포탈 열고 이동
함께 보면 좋은 글
2022.03.23 - [시스템 설계 및 디자인/객체지향 SOLID] - [디자인패턴][SOLID] 개방/폐쇄 원칙
참고 자료
https://refactoring.guru/design-patterns/adapter
https://www.tutorialspoint.com/design_pattern/adapter_pattern.htm
https://www.baeldung.com/java-adapter-pattern
https://javarevisited.blogspot.com/2016/08/adapter-design-pattern-in-java-example.html#axzz7Oxw2Wens
'시스템 설계 및 디자인 > 디자인 패턴' 카테고리의 다른 글
[디자인패턴][Flyweight] 플라이웨이트 패턴 (0) | 2022.03.29 |
---|---|
[디자인패턴][State] 상태 패턴 (0) | 2022.03.25 |
[ 디자인패턴][Builder] 빌더 패턴 (0) | 2022.03.25 |
[디자인패턴][Bridge] 브릿지 패턴 (0) | 2022.03.25 |
[디자인패턴][Template Method] 템플릿 메소드 패턴 (2) | 2022.03.25 |