๋ฐ์ํ
Bridge Pattern
๋ธ๋ฆฌ์ง ํจํด(Bridge Pattern)์ ์ํํธ์จ์ด ๋์์ธ ํจํด ์ค ํ๋๋ก, ๊ตฌํ๋ถ์ ์ถ์ํ๋ ์ธํฐํ์ด์ค(๊ธฐ๋ฅ) ๋ฅผ ๋ถ๋ฆฌํ์ฌ ์๋ก ๋ ๋ฆฝ์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋๋ก ํ๋ ํจํด์ ๋๋ค.
- ์ด ํจํด์ ๊ตฌ์กฐ ํจํด(Structural Pattern) ์ค ํ๋๋ก, ์์คํ ์ ๋ ๋ชจ๋ํํ๊ณ ์ ์ง๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- Abstraction
- High Level Layer
- ์ดํ๋ฆฌ์ผ์ด์ ์ Interface ํน์ UI
- Implementor
- ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋์๊ฐ๋ ์ค์ ๊ตฌํ ์ฝ๋
Abstraction๋ง ๋ณผ ์ ์๊ณ ์ค์ Implementor์ ์จ๊ธธ ์ ์๋ ๊ตฌ์กฐ์ ๋๋ค.
์ธ๋ถ์์ ๋ณด์ฌ์ง๋ ๊ฒ๊ณผ ๋ด๋ถ Implementor๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๊ธฐ ์ข์ต๋๋ค.
Bridege Pattern: Example 1
Class ๊ณ์ธต์ ํผ์ฌ์ ๋ถ๋ฆฌ
์ฐ๋ฆฌ๊ฐ ํ์ ํด๋์ค๋ฅผ ๋ง๋๋ ค๊ณ ํ ๋, ์์ ์ ์๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํด๋ณผ ํ์๊ฐ ์์ต๋๋ค.
๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๋ ์๋์ธ๊ฑด์ง, ์ํํ๋ ค๋ ์๋์ธ๊ฑด์ง?
- ํด๋์ค ๊ณ์ธต์ด ํ๋๋ผ๋ฉด ๊ธฐ๋ฅ์ ํด๋์ค ๊ณ์ธต๊ณผ ๊ตฌํ์ ํด๋์ค ๊ณ์ธต์ด ํ๋์ ๊ณ์ธต ๊ตฌ์กฐ ์์ ํผ์ฌ๋ ์ ์์ต๋๋ค.
- ์ด๋ ๊ฒ ๋๋ฉด ํด๋์ค ๊ณ์ธต์ ๋ณต์กํ๊ฒ ํ์ฌ ์์ธก์ ์ด๋ ต๊ฒ ํ๊ธฐ๋ ํฉ๋๋ค.
- ๋ํ ํ์ ํด๋์ค๋ฅผ ๋ง๋๋ ค๊ณ ํ ๋ ํด๋์ค ๊ณ์ธต์ ์ด๋์ ๋ง๋ค์ด์ผ ํ ์ง ํด๋งค๊ฒ ๋ฉ๋๋ค.
- ๊ธฐ๋ฅ์ ํด๋์ค ๊ณ์ธต, ๊ตฌํ์ ํด๋์ค ๊ณ์ธต์ ๋๊ฐ์ ๋ ๋ฆฝ๋ ํด๋์ค ๊ณ์ธต์ผ๋ก ๋ถ๋ฆฌํ๋๊ฒ์ด ํ์ํฉ๋๋ค.
- ๊ทผ๋ฐ, ๋จ์ํ ๋ถ๋ฆฌํด๋ฒ๋ฆฌ๋ฉด ํฉ์ด์ง๊ธฐ ๋๋ฌธ์ ๋ ๊ฐ์ ํด๋์ค ๊ณ์ธต ์ฌ์ด์ ๋ค๋ฆฌ๋ฅผ ๋์์ค ํ์๊ฐ ์์ต๋๋ค. → ์ด ๋ค๋ฆฌ๋ฅผ Bridge Pattern์ผ๋ก ๋์์ค๋๋ค.
Bridge Pattern
- Abstraction๊ณผ Implementor๋ฅผ ๋ถ๋ฆฌํด์ independentํ๊ฒ ๋ง๋ญ๋๋ค.
- Abstraction๊ณผ Implementor ์ฌ์ด์ ๋ค๋ฆฌ๋ฅผ ๋๋ ์ญํ ์ ๋๋ค.
Bridge Pattern: Example 2
- Animal์ Boat, Car, Airplane ์ค์ ํ์์ผ ํฉ๋๋ค.
- Class ๊ตฌ์กฐ ๊ณ ๋ คํ์ง ์๊ณ ์ฝ๋ฉ์ ํ๋ค๋ฉด Animal 2์ข ๋ฅ ์ด์ก์๋จ 3์ข ๋ฅ, ์ฆ 6(2x3=6)๊ฐ์ง ํด๋์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ค์ผ ํ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
- ๋ง์ฝ ์ฌ๊ธฐ์ ๋ ๋ง์ ์ข ๋ฅ๊ฐ ์๊ธฐ๋ฉด ๋ณต์กํด์ง๋๋ค. ์ด๋ Bridge Pattern์ ์๊ฐํด๋ณผ ์ ์์ต๋๋ค.
- Vehicle class๋ฅผ ๋ง๋ค์ด Base class๋ก ์ผ๊ณ Boat, Car, Airplane class๋ Vehicle class๋ฅผ ์์๋ฐ์ต๋๋ค.
- Vehicle class๋ Animal์ property๋ก ๊ฐ๊ณ ์์ต๋๋ค.
- Vehicle๊ณผ Animal ๋ ์ฌ์ด์ ๊ด๊ณ๊ฐ ์ด์ด์ง๋ฉด์ Bridge๋ก ๋ด ๋๋ค.
# Animal classes
class Animal:
def speak(self):
pass
class Cat(Animal):
def speak(self):
print('a cat ', end='')
class Dog(Animal):
def speak(self):
print('a dog ', end='')
- Animal์์ ์์๋ฐ์ Cat๊ณผ Dog class๊ฐ ์กด์ฌํฉ๋๋ค.
- ๋ชจ๋ speak ํจ์๊ฐ ์กด์ฌํฉ๋๋ค.
# Vehicle classes
class Vehicle:
def __init__(self, animal: Animal):
self.animal = animal
def start(self):
pass
class Car(Vehicle):
def start(self):
self.animal.speak()
print('drives a car')
class Boat(Vehicle):
def start(self):
self.animal.speak()
print('sails a boat')
class Airplane(Vehicle):
def start(self):
self.animal.speak()
print('flies an airplane')
- Vehicle class๋ ๋ด๋ถ์ Animal Object๊ฐ ์กด์ฌํฉ๋๋ค.
- start ํจ์๋ ์กด์ฌํฉ๋๋ค.
- Car, Boat, Airplane class๋ Vehicle์ ์์ ๋ฐ์ต๋๋ค.
# Usage example
cat = Cat()
boat = Boat(cat)
boat.start() # ์ถ๋ ฅ: a cat sails a boat
- Cat object์ธ cat์ ์์ฑํฉ๋๋ค.
- Boat object์ธ boat ์์ฑํ ์ธ์๋ก cat์ ๋๊ฒจ์ค๋๋ค.
- boat๋ฅผ ์ถ๋ฐ์ํค๋ฉด boat๋ฅผ ํ cat์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
dog = Dog()
car = Car(dog)
car.start() # ์ถ๋ ฅ: a dog drives a car
- Dog object์ธ dog์ ์์ฑํฉ๋๋ค.
- Car object์ธ car ์์ฑํ ์ธ์๋ก dog์ ๋๊ฒจ์ค๋๋ค.
- car๋ฅผ ์ถ๋ฐ์ํค๋ฉด car๋ฅผ ํ dog์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
Bridge Pattern: Example 3
# Abstraction ์ญํ ์ Car class
class Car:
def __init__(self, power: Power):
self.power = power
def drive(self):
self.power.powerUp()
def stop(self):
self.power.powerDown()
class Sedan(Car):
def sedanOnlyFn(self):
print('sedan only')
- Abstraction ์ญํ ์ Car class ์ ๋๋ค.
- ๋ด๋ถ Property๋ก power๋ฅผ ๊ฐ์ง๋๋ค.
- Sedan์ Car ์ข ๋ฅ๋ก ์์ ๋ฐ์ต๋๋ค.
- Drive, Stop ํจ์๊ฐ ์์ต๋๋ค.
- Drive ํจ์๋ PowerUp, Stop ํจ์๋ PowerDown์ ํธ์ถํฉ๋๋ค.
# Implementor ์ญํ ์ Power class
class Power:
def powerUp(self):
pass
def powerDown(self):
pass
class Engine(Power):
def powerUp(self):
print('engine power up')
def powerDown(self):
print('engine power down')
class Motor(Power):
def powerUp(self):
print('motor power up')
def powerDown(self):
print('motor power down')
- Implementor ์ญํ ์ Power Class ์ ๋๋ค.
- Engine, Motor๋ Power ์ข ๋ฅ๋ก ์์ ๋ฐ์ต๋๋ค.
- PowerUp, PowerDown ํจ์๊ฐ ์์ต๋๋ค.
# Usage example
sedan = Sedan(Motor())
sedan.drive() # ์ถ๋ ฅ: motor power up
sedan.stop() # ์ถ๋ ฅ: motor power down
sedan.sedanOnlyFn() # ์ถ๋ ฅ: sedan only
- Sedan ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ argument๋ก Power์ ์์ Class์ Motor๋ฅผ ๋๊ฒจ์ค๋๋ค.
- Sedan.driveํ์ฌ powerUp ํจ์๋ฅผ ํธ์ถ ํฉ๋๋ค.
- Sedan.stopํ์ฌ powerDown์ ํธ์ถ ํฉ๋๋ค.
- sedanOnlyFN์ ํธ์ถํฉ๋๋ค.
- ๋ด๋ถ Implementor๋ Motor์ด์ง๋ง ๊ทธ ์ธ๋ถ๋ Sedan์ด๋ผ๋ Output์ด ๋์ต๋๋ค.
Bridge Pattern์ ๊ฒ์์ ๋ณด์ฌ์ง๋ Abstraction๊ณผ ๋ด๋ถ Implementor๋ฅผ ๊ตฌ๋ถํด์ Bridge๋ก ์ฐ๊ฒฐํ๋ ์ญํ ์ ํฉ๋๋ค.
๋ถ๋ฆฌํด ๋๋ฉด ํ์ฅ์ด ํธํด์ง๋๋ค
- Bridge pattern์ ๊ธฐ๋ฅ์ Class, ๊ตฌํ์ Class ๊ณ์ธต์ ๋ถ๋ฆฌํฉ๋๋ค.
- ์ด ๋๊ฐ์ ํด๋์ค ๊ณ์ธต์ ๋ถ๋ฆฌํด ๋๋ฉด ๊ฐ๊ฐ์ ํด๋์ค ๊ณ์ธต์ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
- ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ์ถ์ผ๋ฉด ๊ธฐ๋ฅ์ ํด๋์ค ๊ณ์ธต์ ํด๋์ค๋ฅผ ์ถ๊ฐํ ์ ์๊ณ , ์ด๋ ๊ตฌํ์ ํด๋์ค ๊ณ์ธต์ ์ ํ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
- ์๋ก ์ถ๊ฐํ ๊ธฐ๋ฅ์ ๋ชจ๋ ๊ตฌํ์ ๋ํด ์ด์ฉํ ์ ์์ต๋๋ค.
์์์ ๊ฒฌ๊ณ ํ ์ฐ๊ฒฐ, ์์์ ๋์จํ ์ฐ๊ฒฐ
- ์์์ ํด๋์ค๋ฅผ ํ์ฅํ๊ธฐ ์ํด ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ด์ง๋ง ํด๋์ค๊ฐ ์ฐ๊ฒฐ์ ๊ฐํ๊ฒ ๊ณ ์ ์ํต๋๋ค.
class SomethingGood(Something)
- SomethingGood ํด๋์ค๋ Something ํด๋์ค์ ํ์ ํด๋์ค๊ฐ ๋๋ฉฐ, ์ด ๊ด๊ณ๋ ์์ค์ฝ๋๋ฅผ ๊ณ ์ณ์ฐ์ง ์๋ ํ ๋ด๊ฟ์ ์๋ ๋งค์ฐ ๊ฒฌ๊ณ ํ ์ฐ๊ฒฐ์ด ๋ฉ๋๋ค.
- ๋ง์ฝ, ํด๋์ค๊ฐ ๊ด๊ณ๋ฅผ ์ฒ์ฒ ๋ด๊พธ๊ณ ์ถ์๋ ์์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ์ ์ ํ ์ ์์ต๋๋ค. ๊ต์ฒดํ ๋๋ง๋ค ์์ค์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์ด๋ฌํ ๊ฒฝ์ฐ์ ‘์์’์ด ์๋๋ผ ‘์์’์ ์ฌ์ฉํ๋๊ฒ์ด ์ ์ ํฉ๋๋ค.
- ์๋ก์ด concrete implementor๋ฅผ ๋ง๋ค๋๋ผ๋ ์ธ์คํด์ค๋ง abstraction์ผ๋ก ๋๊ฒจ์ฃผ๋ฉด ์์ค์ฝ๋ ์์ ์ด ํ์์์ด ๋ฐ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
๋ธ๋ฆฟ์ง ํจํด
๋ฐ์ํ
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Composite Pattern - ์ปดํฌ์งํธ ํจํด (0) | 2024.06.08 |
---|---|
[Design Pattern] Flyweight Pattern - ํ๋ผ์ด์จ์ดํธ ํจํด (0) | 2024.06.06 |
[Design Pattern] Facade Pattern - ํ์ฌ๋ ํจํด (0) | 2024.06.06 |
[Design Pattern] Decorator Pattern - ๋ฐ์ฝ๋ ์ดํฐ ํจํด (0) | 2024.06.05 |
[Design Pattern] Adapter Pattern - ์ด๋ํฐ ํจํด (0) | 2024.05.27 |