๋ฐ์ํ
Adapter Pattern - ์ด๋ํฐ ํจํด
Adapter Pattern์ ํธํ๋์ง ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ํด๋์ค๋ค์ด ํจ๊ป ๋์ํ ์ ์๋๋ก ์ค๊ฐ์ ์ด๋ํฐ๋ฅผ ๋์ด ์ธํฐํ์ด์ค๋ฅผ ๋ณํํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
- ํ๋์ Interface๋ฅผ ๋ค๋ฅธ Interface๋ก ์ ํํ๋ ์ญํ → ์ด๋ฌํ ์ญํ ์ Adapter Pattern์ ์ ์ฉํฉ๋๋ค.
- ‘์ด๋ฏธ ์ ๊ณต๋์ด ์๋ ๊ฒ’๊ณผ ‘ํ์ํ ๊ฒ’ ์ฌ์ด์ ‘์ฐจ์ด’๋ฅผ ์์ ์ฃผ๋ ๋์์ธ ํจํด์ Adapter ํจํด์ด๋ผ๊ณ ํฉ๋๋ค.
- ๋ํ Adapter ํจํด์ Wrapper ํจํด์ผ๋ก ๋ถ๋ฆฌ๊ธฐ๋ ํฉ๋๋ค.
- Wrapper๋ ‘๊ฐ์ธ๋ ๊ฒ’์ด๋ผ๋ ์๋ฏธ๊ฐ ์๋๋ฐ, ๋ฌด์ธ๊ฐ๋ฅผ ํฌ์ฅํด์ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉํ ์ ์๊ฒ ๊ตํํด์ฃผ๋ ๊ฒ์ด wrapper์ด๋ฉฐ, adapter๋ผ๊ณ ํฉ๋๋ค.
- ๋๊ฐ์ง์ ์ข
๋ฅ๊ฐ ์์ต๋๋ค.
- ํด๋์ค์ ์ํ Adapter ํจํด (์์ํ๋ ๋ฐฉ๋ฒ)
- ์ธ์คํด์ค์ ์ํ Adapter ํจํด (์์ ํ๋ ๋ฐฉ๋ฒ)
ํต์ฌ ๊ฐ๋
Example)
Target: ์ง๋ฅ 12V
Client: ๋คํธ์ํฌ
Adapter: ์ ๋ฅ ๋ณํ ์ด๋ํฐ
Adaptee: ์ ๊ณต๋๋ ๊ต๋ฅ 100V
- Target Interface: Client๊ฐ ๊ธฐ๋ํ๋ Interface๋ฅผ ์ ์ํฉ๋๋ค.
- Adaptee ํด๋์ค: ๊ธฐ์กด์ Interface๋ฅผ ์ ๊ณตํ๋ Class์ ๋๋ค.
- Adapter ํด๋์ค: Adaptee ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ Target Interface๋ก ๋ณํํ๋ Class์ ๋๋ค.
- Client: Target Interface๋ฅผ ํตํด Adapter์ ์ํธ์์ฉํ๋ Class์ ๋๋ค.
์ฅ์
- ํธํ์ฑ ์ ๊ณต: ํธํ๋์ง ์๋ Interface๋ฅผ ๊ฐ์ง Class๋ค ๊ฐ์ ํ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๊ธฐ์กด ์ฝ๋ ์์ ์ต์ํ: ๊ธฐ์กด Class์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐฉ-ํ์ ์์น ์ค์: ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ํ์ฅํ ์ ์์ต๋๋ค.
๋จ์
- ์ถ๊ฐ์ ์ธ Class ์์ฑ: Adapter Class๋ฅผ ์ถ๊ฐ๋ก ์์ฑํด์ผ ํ๋ฏ๋ก Code๊ฐ ๋ค์ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
- ํผํฌ๋จผ์ค ์ํฅ: ์ถ๊ฐ์ ์ธ ๊ณ์ธต์ด ์๊ธฐ๋ฉด์ Performance(์ฑ๋ฅ)์ ์ฝ๊ฐ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
Adapter Pattern Example
(hello), hello ← ์ฃผ์ด์ง ๋ฌธ์์ด์ ๋ค์๊ณผ ๊ฐ์ด ํ๊ธฐํ๊ณ ์ ํ ๋
๋ชฉ์ : Banner ํด๋์ค๋ฅผ ์ฌ์ฉํด์ Print ์ธํฐํ์ด์ค๋ฅผ ์ถฉ์กฑ์ํค๋ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค.
- ์ฌ๊ธฐ์ ์ ๊ณต๋๊ณ ์๋๊ฑด, ๊ตํ์ฅ์น: Adapter, ํ์ํ ๊ฒ: Target ์ ๋๋ค.
- ์ฌ๊ธฐ์ Print ์ธํฐํ์ด์ค๋ → Framework๋ฅผ ๋ด๋นํฉ๋๋ค.
- Banner ํด๋์ค (์ ๊ณต๋๊ณ ์๋ ๊ฒ)
- ๋ฌธ์์ด์ ๊ดํธ๋ก ๋ฌถ์ด์ ํ์ํ๋ showWithParen ๋ฉ์๋ [ ( ) ]
- *๋ฅผ ๋ถ์ฌ ํ์ํ๋ showWithAster ๋ฉ์๋ [ * ]
- Print ํด๋์ค (ํ์ํ ๊ฒ)
- ๋ฌธ์์ด์ ๋์จํ๊ฒ ํ์ํ๊ธฐ ์ํ printWeak ๋ฉ์๋ [ ( ) ]
- ๋ฌธ์์ด์ ๊ฐํ๊ฒ ํ์ํ๊ธฐ ์ํ printStrong ๋ฉ์๋ [ * ]
- PrintBanner ํด๋์ค (๊ตํ ์ฅ์น)
- ์ ๊ณต๋์ด ์๋ Bannerํด๋์ค๋ฅผ ์์ํด์, ํ์๋ก ํ๋ Print ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค.
- ShowWithParen ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ printWeak๋ฅผ ๊ตฌํํ๊ณ
- ShowWithAster ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ printStrong์ ๊ตฌํํ๊ณ ์ ํฉ๋๋ค.
Adapter Pattern (์์ ์์)
class Banner(): # Adaptee
def __init__(self, word):
self.word = word
def showWithParen(self):
print("(" + self.word + ")")
def showWithAster(self):
print("*" + self.word + "*")
class Print(): # Target
def printWeak(self):
pass
def printStrong(self):
pass
class PrintBanner(Banner, Print): # ์์ (Adapter)
def __init__(self, word): # word -> banner ๊ธฐ๋ฅ ์ํ
# ํ์ฌํด๋์ค๊ฐ ์ด๋คํด๋์ค์ธ์ง๋ฅผ ๋ช
ํํ ํ๊ธฐ
super(PrintBanner, self).__init__(word)
def printWeak(self):
self.showWithParen()
def printStrong(self):
self.showWithAster()
# client, Framework
pb = PrintBanner("Hello")
pb.printStrong()
pb.printWeak()
[Running] python -u "/Users/daehyunkim/Documents/GitHub/Bigbread-HUFS-Subject/2024-1 Design Pattern/Week 4/test.py"
*Hello*
(Hello)
Adapter Pattern (์์ ์์)
class Banner(): # Adaptee
def __init__(self, word):
self.word = word
def showWithParen(self):
print("(" + self.word + ")")
def showWithAster(self):
print("*" + self.word + "*")
class Print(): # Target
def printWeak(self):
pass
def printStrong(self):
pass
class PrintBanner(Print): # ์์ (Adapter)
def __init__(self, word):
self.banner = Banner(word)
def printWeak(self):
self.banner.showWithParen()
def printStrong(self):
self.banner.showWithAster()
# client, Framework
pb = PrintBanner("Hello")
pb.printStrong()
pb.printWeak()
[Running] python -u "/Users/daehyunkim/Documents/GitHub/Bigbread-HUFS-Subject/2024-1 Design Pattern/Week 4/test.py"
*Hello*
(Hello)
Adapter Pattern (๋ค๋ฅธ ์์)
class Animal: # target
def walk(self):
pass
class Cat(Animal):
def walk(self):
print("Cat walking")
class Dog(Animal):
def walk(self):
print("Dog walking")
def makeWalk(animal: Animal): # client
animal.walk() # ํธํ์ฑ ๋์ ์ํ
- Base class: Animal → walk ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- Animal์ ์์๋ฐ์ Cat & Dog Class ๋ชจ๋ walk interface ๊ฐ์ง๊ณ ์์ต๋๋ค.
- makeWalk ํจ์๋ animal์ argument๋ก ๊ฐ๊ณ Animal class์ walk ํจ์๋ฅผ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
walk ์ฌ์ฉ์, animal interface ์ฌ์ฉ
kitty = Cat()
bingo = Dog()
makeWalk(kitty)
makeWalk(bingo)
- Kitty & Bingo๋ ๊ฐ๊ฐ Cat๊ณผ Dog object์ด๋ฉฐ makeWalk๋ฅผ ํตํด walkํจ์๋ฅผ ์คํ์ํฌ ์ ์์ต๋๋ค.
Client → makewalk() → FIsh
class Fish: # Adaptee
def swim(self):
print("fish swimming")
nemo = Fish()
makewalk(nemo)
- Fish class๋ swim interface๋ง ์์ต๋๋ค.
- Fish class์ nemo object๋ฅผ ๋ง๋ค์ด์ makeWalk ํจ์๋ก ๋๊ฒจ์ฃผ๋ฉด Error๊ฐ ๋ฐ์ํฉ๋๋ค.
AttributeError: ‘Fish’ Object has no attribute ‘walk’
- Fish class์ Object๊ฐ makeWalk interface๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ Fish & Animal interface๋ฅผ ์ฐ๊ฒฐ์์ผ ์ฃผ๋ Adapter๊ฐ ์์ด์ผ ํฉ๋๋ค
class FishAdapter(Animal): # Adapter
def __init__(self, fish):
self.fish = fish
def walk(self):
self.fish.swim()
nemo = Fish()
adapted_nemo = FishAdapter(nemo)
makeWalk(adapted_nemo)
# result: fish swimming
- FishAdapter class๋ Animal์ ์์๋ฐ๊ณ constructor ์์์ Fish object๋ฅผ ๋ฐ์ต๋๋ค.
- Nemo๋ Fish Object์ด๊ณ adapted_nemo๋ FishAdapter์ nemo๋ฅผ ๋๊ฒจ์ค๋๋ค.
- MakeWalk์ adapted_nemo๋ฅผ ๋๊ฒจ์ฃผ๋ฉด Fish์ Swim interface๋ฅผ FishAdapter์ walk์ ํตํด ๋ถ๋ฌ๋ ๋๋ค.
Adapter pattern์ ๋ง์ง ์๋ ๊ธฐ์กด์ interface๋ฅผ ํ์ฌ ์ฝ๋์ ๋ง๊ฒ ๋ณํ์์ผ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
๋ฐ์ํ
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Facade Pattern - ํ์ฌ๋ ํจํด (0) | 2024.06.06 |
---|---|
[Design Pattern] Decorator Pattern - ๋ฐ์ฝ๋ ์ดํฐ ํจํด (0) | 2024.06.05 |
[Design Pattern] Proxy Pattern - ํ๋ก์ ํจํด (0) | 2024.05.27 |
[Design Pattern] Singleton Pattern - ์ฑ๊ธํค ํจํด & Metaclass (0) | 2024.05.21 |
[Design Pattern] Builder Pattern - ๋น๋ ํจํด (0) | 2024.05.21 |