관리 메뉴

밤 늦게까지 여는 카페

[디자인 패턴] 브릿지(Bridge) 패턴이란 본문

디자인 패턴/구조 패턴

[디자인 패턴] 브릿지(Bridge) 패턴이란

Jㅐ둥이 2022. 8. 27. 09:30
반응형

오늘 공부할 디자인 패턴은 브릿지 패턴입니다. 너무나 행복하면서 부끄러워지는 날인데요.
지금까지 브릿지 패턴을 컴퍼짓 패턴으로 알고 있었더라구요.
잘못된 지식을 올바르게 고칠 수 있어서 기쁘지만 주변에 말하고 다녔던 것을 생각하면 한없이 부끄러워지네요.

1. 브릿지 패턴이란

브릿지 패턴을 추상 클래스와 구현 클래스를 분리함으로써 의존성 문제를 해결하고 구현의 유연성을 가져가는 것이 목표입니다. 아주 아주 간단하게 설명드리면 클래스 내부에서 다른 클래스를 활용하여 기능을 구현하는 방법입니다.

이렇게 클래스가 직접적으로 기능을 구현하지 않고 다른 클래스를 활용하면 얻는 장점이 무엇일까요?
추상화 부분은 소프트웨어의 전체적인 구조에 알맞게 추상화를 제공하면서, 구현부는 구현부에 적합한 인터페이스를 유지할 수 있습니다.

이제 예시를 살펴보면서 직접 공부해보죠!

2. 활용하기 좋은 순간

  • 추상 클래스들과 구현체 클래스들이 각각 독립적인 확장이 가능해야 할 때
  • 추상 클래스의 수정과 구현체 클래스의 수정이 서로에게 영향을 주지 않아야 할 때
  • (팁) 추상 팩토리 패턴과 같이 활용하면 더욱 좋음

3. 예시

이번에도 CarInterface를 활용해볼 것인데요. 지금까지는 CarInterfaceaccelerate, break 메소드를 호출하면 속도가 바로 변했죠? 이 부분을 구현체 클래스들을 이용해서 구현해보겠습니다.

CarInterface와 AccelPartInterface, BreakPartInterface를 분리하여 다양한 AccelPart와 BreakPart를 사용할 수 있게되었습니다! 아래의 예시처럼 HyundaiAccel, HyundaiBreak, KiaAccel, KiaBreak 등 어떤 부품이라도 유연하게 사용할 수 있게 되었습니다.

이렇게 다양한 설정을 가질 수 있는 구조를 보니 어떤 패턴을 사용하고 싶어지지 않나요?맞습니다! 바로 추상 팩토리 패턴을 활용해서 브릿지 패턴을 더욱 잘 사용할 수 있습니다.런타임 혹은 설정값에 따라서 클래스를 초기화 할 수 있다면 더욱 읽기 쉽고, 유지보수 잘되는 소프트웨어를 구성할 수 있습니다.

## car.py
from abc import ABCMeta, abstractmethod

class CarInterface(metaclass=ABCMeta):
    def __init__(self, *, accel_part: AccelPartInterface, break_part: BreakPartInterface):
        self.accel_part = accel_part
        self.break_part = break_part
        
        self.speed = 0
    
    @abstractmethod
    def break(self):
        self.speed = max(0, self.speed - self.break_part.push())
        
    @abstractmethod
    def accelerate(self):
    	self.speed = self.speed + self.accel_part.push()

## accel.py
class AccelPartInterface(metaclass=ABCMeta):
    @abstractmethod
    def push(self) -> float:
        pass
    
    @abstractmethod
    def flow_oil(self) -> float:
        pass
        
## break.py
class BreakPartInterface(metaclass=ABCMeta):
    @abstractmethod
    def push(self) -> float:
        pass
        
    @abstractmethod
    def squeeze_caliper(self) -> float:
        pass
## hyundai_accel.py
class HyundaiAccel(AccelPartInterface):
    def __init__(self):
        self.flow = 0.5
    
    def push(self) -> float:
        return self.flow_oil() / 2.5
    
    def flow_oil(self) -> float:
        return self.flow
        
## hyundai_break.py
class HyundaiBreak(BreakPartInterface):
    def __init__(self):
        self.friction = 0.1
    
    def push(self) -> float:
        return self.squeeze_caliper() * 9.8
    
    def squeeze_caliper(self) -> float:
        return self.friction
        
## kia_accel.py
class KiaAccel(AccelPartInterface):
    def __init__(self):
        self.flow = 0.3
    
    def push(self) -> float:
        return self.flow_oil() / 2.2
    
    def flow_oil(self) -> float:
        return self.flow
        
## kia_break.py
class KiaBreak(BreakPartInterface):
    def __init__(self):
        self.friction = 0.15
    
    def push(self) -> float:
        return self.squeeze_caliper() * 9.8
    
    def squeeze_caliper(self) -> float:
        return self.friction
반응형