HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📝
남득윤 학습 저장소
/
객체 지향 프로그래밍
객체 지향 프로그래밍
/
디자인 패턴
디자인 패턴
/
🌉
Bridge Pattern
🌉

Bridge Pattern

Motivation

추상화가 다른 구현을 가져야하는 경우가 있다.
RDB나 File System과 같은 다양한 플랫폼을 통해 Objects의 영속성을 관리하는 객체를 생각해보자. 상속을 이용해 RDBMS와 file system 각각을 담당하는 기능의 구현을 하여 해결할 수 있다.
 
하지만 상속은 구현과 추상화에 대한 결합도를 높인다. 수정, 확장 재사용성이 떨어진다.

Intent

💡
decouple abstraction from implementation

Implementation

notion image
 
  • Abstraction - 추상화 인터페이스
  • AbstractionImpl - 구현체
  • Implementor - 구현 클래스의 인터페이스를 정의함
  • ConcreteImplemnetor - 구체 구현체
 

Description

브릿지 패턴은 Abstraction과 Implementation으로 구성된다. 중간에 다리를 하나 놓아서 Abstraction의 상속, Implementor 의 추가 구현은 서로에게 영향을 주지 않는다. (Low coupling)

Applicablity

브릿지 패턴은 Abstraction과 Implementation 사이의 결합도를 줄이고 싶을때, 특히 다양한 Abstraction과 Implementation의 구현이 필요한 경우 사용된다.

Examples

Object Persistence API Example
notion image
code example
전체 코드는 여기서 확인 할 수 있습니다.
public class PersistenceFrameworkDriver { public static void main(String[] args) { Persistence persistenceAPI = null persistenceAPI = new PersistenceImpl(new FileSystemPersistenceImplementor()); Object o = persistenceAPI.findById("12343755"); // do changes to the object // then persist persistenceAPI.persist(o); // can also change implementor persistenceAPI = new PersistenceImpl(new DatabasePersistenceImplementor()); persistenceAPI.deleteById("2323"); } }
PersistenceFrameworkDriver - main 코드 살짝 수정
메인 코드와 Dependency Diagram만 살펴보겠습니다.
처음 영속성 API는 FileSystemPersistenceImplementor를 사용하는 것으로 설정되었고 findById와 persist를 호출하는 것으로 api를 사용하였습니다. 이후에 영속성 객체는DatabasePersistenceImplementor를 사용하는 것으로 바꾸었습니다.
 
이처럼 브릿지 패턴을 활용해서 Persistence (Abstraction) 와 직접적인 영속성 API를 제공하는 XXXPersistenceImplementor (Implementation)과의 커플링을 제거하였기 때문에 런타임에 간단하게 설정을 변경할 수 있습니다.
 
다리에 해당되는 PersistenceImpl과 PersistenceImplementor 의 코드를 살펴보면 정말 아무것도 안하고 중간에 다리만 놓아 주는 것을 확인할 수 있습니다.
Dependency Diagram
Dependency Diagram
 
 

Specific problems & Implementation

GUI Frameworkds
GUI 프레임워크는 보통 사용자의 플랫폼에 따라 구현이 달라지는데 이경우 Abstraction과 Implementation을 분리하기 위해 Bridge 패턴을 사용할 수 있다.
예를 들어 WindowAbstractionImpl을 WindowImplementation과 연결하는 과정에 다리를 놓는다면 Implementor의 구현체로 LinuxImplementation을 추가하여도 WindowAbstractionImpl에는 전혀 영향이 없다. 마찬가지로 Abstraction을 상속하여 MaxAbstractionImpl을 추가하여도 WindowImplementation에는 영향이 없다.
 
 
관련 패턴
추상 팩토리 패턴 - 추상 팩토리 패턴을 확용해서 브릿지 패턴의 다리를 구현하는 방식을 동적으로 생성/설정할 수 있다.
 

Consquences

  • 인터페이스와 구현체의 결합도를 없앤다. Abstraction의 Implementation은 심지어 런타임에 설정될 수도 있다.
  • Abstraction과 Implementor는 독립적으로 확장될 수 있다.
 

Known Uses:

  • GUI frameworks
  • Persistence Frameworks