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

- Abstraction - 추상화 인터페이스
- AbstractionImpl - 구현체
- Implementor - 구현 클래스의 인터페이스를 정의함
- ConcreteImplemnetor - 구체 구현체
Description
브릿지 패턴은
Abstraction
과 Implementation
으로 구성된다. 중간에 다리를 하나 놓아서 Abstraction
의 상속, Implementor
의 추가 구현은 서로에게 영향을 주지 않는다. (Low coupling)Applicablity
브릿지 패턴은
Abstraction
과 Implementation
사이의 결합도를 줄이고 싶을때, 특히 다양한 Abstraction과 Implementation의 구현이 필요한 경우 사용된다.Examples
Object Persistence API Example

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"); } }
메인 코드와 Dependency Diagram만 살펴보겠습니다.
처음 영속성 API는
FileSystemPersistenceImplementor
를 사용하는 것으로 설정되었고 findById
와 persist
를 호출하는 것으로 api를 사용하였습니다. 이후에 영속성 객체는DatabasePersistenceImplementor
를 사용하는 것으로 바꾸었습니다.이처럼 브릿지 패턴을 활용해서
Persistence
(Abstraction) 와 직접적인 영속성 API를 제공하는 XXXPersistenceImplementor
(Implementation)과의 커플링을 제거하였기 때문에 런타임에 간단하게 설정을 변경할 수 있습니다.다리에 해당되는
PersistenceImpl
과 PersistenceImplementor
의 코드를 살펴보면 정말 아무것도 안하고 중간에 다리만 놓아 주는 것을 확인할 수 있습니다.
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