본문 바로가기

개발 상식

브릿지패턴(Bridge Pattern)

반응형

브릿지(Bridge) 패턴은 GoF(디자인 패턴) 중 하나로, 구조(Structural) 패턴에 속합니다.
"구현부에서 추상층을 분리하여, 둘이 독립적으로 확장할 수 있도록 하는 패턴"입니다.

🔧 쉽게 말하면?

클래스들이 여러 방향(기능 + 플랫폼 등)으로 확장될 가능성이 있을 때,
상속을 계속 늘리기보다는,
기능 계층과 구현 계층을 분리해서 조합(composition)으로 해결하자!는 전략

📦 구조 예시 (UML 개념)

         Abstraction
              |
      -------------------
      |                 |
RefinedAbstraction   Implementor <== 구현 계층 (인터페이스)
                            |
                      ConcreteImplementorA
                      ConcreteImplementorB

 

  • Abstraction : 클라이언트가 사용하는 인터페이스 (추상화 계층)
  • Implementor : 실제 동작을 수행하는 인터페이스 (구현 계층)
  • RefinedAbstraction : Abstraction의 구체 클래스
  • ConcreteImplementor : 실제 구현 클래스

📱 예시 – 리모컨과 TV

// 구현부 (Implementor)
interface TV {
    fun on()
    fun off()
    fun tuneChannel(channel: Int)
}

class SamsungTV : TV {
    override fun on() = println("Samsung TV on")
    override fun off() = println("Samsung TV off")
    override fun tuneChannel(channel: Int) = println("Samsung: channel $channel")
}

class LGTV : TV {
    override fun on() = println("LG TV on")
    override fun off() = println("LG TV off")
    override fun tuneChannel(channel: Int) = println("LG: channel $channel")
}

// 추상화부 (Abstraction)
abstract class RemoteControl(protected val tv: TV) {
    abstract fun turnOn()
    abstract fun turnOff()
}

class BasicRemote(tv: TV) : RemoteControl(tv) {
    override fun turnOn() = tv.on()
    override fun turnOff() = tv.off()
}

 

➡️ 이제 BasicRemote는 TV 인터페이스를 따르는 어떤 TV든 조작할 수 있음.
TV가 늘어나도, RemoteControl 계열은 영향 안 받고 확장 가능.

✅ 언제 쓰면 좋을까?

  • 클래스 계층이 기능/구현 방향으로 계속 확장될 경우
  • 서로 독립적인 변경이 필요할 경우 (기능 ↔ 구현)
  • 런타임에 기능을 바꿔서 조합하고 싶을 때

책으로 읽고 이해하기 어려웠는데 GPT가 이해하기 쉽게 설명해줘서 내용 첨부합니다!

반응형