브리지 패턴 (Bridge pattern)

임동혁 Ldhbenecia·2023년 4월 10일
0

Design Pattern

목록 보기
1/6

디자인 패턴: Bridge Pattern

  • Bridge는 '다리'의 의미를 가지고 있다.

  • 현실에서 두 개의 장소를 서로 연결하는 역할을 하듯이 Bridge Pattern도 두 장소를 연결하는 역할을 한다.

  • 이 패턴은 추상화(Abstraction)와 구현(Implementaion)을 분리한다.

  • 추상화는 인터페이스로 정의되며, 구현은 추상화로부터 분리된다.


용어 정리

  • Abstraction: 추상화
    • 기능을 정의하는 인터페이스(기능 클래스 계층)
    • 구현과 분리되어 있음
    • 기본 기능만 정의되어 있음
  • Implementor: 구현자
    • Abstraction 인터페이스에 대한 구현을 제공하는 인터페이스(구현 클래스 계층)
    • Abstraction과 분리되어 있으므로, 구현의 변경이 Abstraction 인터페이스에 영향 x

  • 즉, Abstraction은 Implementor과 분리되어 인터페이스를 제공하며 Implementor은 Abstraction이 사용할 수 있는 기본 작업을 제공하는 인터페이스

  • 기능 클래스 계층
    • 상위 클래스는 기본적인 기능을 가지고 있다.
    • 하위 클래스에서 새로운 기능을 추가한다.

  • 구현 클래스 계층
    • 상위 클래스는 추상 메서드에 의해 인터페이스를 규정한다
    • 하위 클래스는 구체적 메 서드에 의해 그 인터페이스를 구현한다.
  • 여기 사용되는 클래스 계층은 기능을 추가하기 위함도, 새로운 메서드를 추가하기 위함도 아님.
  • 단순히 역할 분담을 위해 클래스 계층이 사용되는 것


Bridge Pattern 사용 이유

  • 클래스 계층이 하나라면 기능의 클래스 계층과 구현의 클래스 계층이 하나의 계층구조 안에 혼재될 수 있음
  • 이럴 시 클래스 계층을 복잡하게 하여 예측을 어렵게 함
  • 하위 클래스를 생성하려고 할 때 클래스 계층의 어디에 만들어야 할지 헤매게 될 수 있음
  • 기능의 클래스 계층과 구현의 클래스 계층을 두 개의 독립된 클래스 계층으로 분리하는 것이 필요함
  • 그러나, 단순히 분리해버리면 흩어지기 때문에 두 개의 클래스 계층 사이에 다리를 놓아줄 필요가 있음
    -> Bridge Pattern


예시 코드

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 함수 존재
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()
  • Vehicle class는 내부에 Animal object 존재
  • start 함수 존재
  • Car, boat, Airplane class는 Vehicle 상속받음
cat = Cat()
boat = Boat(cat)
boat.start() # a cat sails a boat

dog = Dog()
car = Car(dog)
car.start() # a dog drives a car
  • Abstraction과 Implementor을 구분한 class 구조를 가지게 되면 나중에 Implemetor에 새로운 구현을 추가한다고 하더라도 그대로 기능은 사용 가능


마무리

  • Bridge Pattern은 기능의 클래스 계층과 구현의 클래스 계층을 분리하는 것
  • 이 두개의 클래스 계층을 분리해 두면 각각의 클래스 계층을 독립적으로 확장 가능
  • 기능을 추가하고 싶으면 기능 클래스 계층에 추가,
    이때 구현 클래스 계층은 수정할 필요 x
  • 새로 추가한 기능은 모든 구현에 대해 이용 가능
profile
지극히 평범한 공대생

0개의 댓글