브리지 패턴(Bridge Pattern)

브리지 패턴은 큰 클래스 또는 밀접한 클래스들의 집합을 두개의 개별 계층구조로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴이다.

문제

Shape를 상속받는 CircleSquare가 있다. 여기서 색상을 추가하면 BlueCircle, RedCircle, BlueSquare, RedSquare가 생길 수가 있다. 그러나 모양이 하나 추가될 때마다 2개의 새로운 클래스가 생기며 색상이 하나 더 생기면 각 3개씩 모양을 추가해야한다. 이러한 기하급수적으로 늘어나는 경우 코드가 복잡해진다

해결책

이러한것은 모양과 색상의 두 가지 독립적인 차원에서 모양 클래스들을 확장하려고 하기 때문에 발생한다.

브리지 패턴은 상속에서 객체 합성으로 전환해 이 문제를 해결하려고 한다. 색상이나 모양의 차원 중 하나를 계층구조로 추출하여 원래 클래스들이 한 클래스 내에서 모든 상태와 행동들을 갖는 대신 새 계층구조의 객체를 참조하도록 하는 것이다.

이 방식이면 색상 관련 코드를 Red, Blue라는 두개의 자식 클래스들이 있는 자체 클래스로 추출할 수 있다. 그리고 모양 클래스가 색을 참조 필드로 가진다면 이 두 객체사이에 브리지가 생긴다.

추상화와 구현

추상화(인터페이스)는 일부 개체(entity)에 대한 상위 수준의 제어 레이어이다. 이 레이어는 실제 작업을 수행하는건 아니고 작업할 구현 레이어(플랫폼)에 위임해야한다. 여기서 말하는 추상화는 Java 레벨의 인터페이스나 추상 클래스가 아니다. 예를들어 추상화는 그래픽 사용자 인터페이스이고, 구현은 그래픽 사용자 인터페이스 레이어가 사용자와 상호작용하여 그 결과로 호출하는 API이다.

이러한 앱은 두가지 독립적인 방향으로 확장할 수 있다

  • 다른 여러가지 그래픽 인터페이스를 가진다
  • 여러 다른 API 들을 지원한다

구조

브리지 디자인 패턴

  • 추상화는 상위 수준의 제어 논리를 제공한다. 구현 객체가 실제 작업을 수행한다
  • 구현은 모든 구상 클래스들에 공통적인 인터페이스를 가지며 추상화는 여기에 선언된 메서드들만 통해 소통할 수 있다
  • 구상 구현들에는 플랫폼별 맞춤형 코드가 포함된다
  • 정제 추상화는 제어 논리의 변형들을 제공한다.
  • 일반적으로 클라이언트는 추상화와 작업하는데만 관심이 있다. 그러나 추상화 객체를 구현 객체들 중 하나와 연결하는 것도 클라이언트의 역할이다.

언제사용?

브리지 패턴은 어떤 기능의 여러 변형을 가진 모놀리식 클래스를 나누고 정돈하려고 할 때 사용한다.

여러 독립 차원에서 클래스를 확장해야 할 때 사용한다

런타임에 구현을 전환할 수 있어야할 때 사용한다

장단점

플랫폼 독립적인 클래스들과 앱들을 만들 수 있다.

상위 수준의 추상화를 통해 작동하고 플랫폼 세부정보에 노출되지 않는다

개방폐쇄 원칙을 지킨다

단일책임 원칙을 지킨다

결합도가 높은 클래스에 패턴을 적용하면 코드가 복잡해진다