브리지 패턴(Bridge Pattern)
브리지 패턴은 큰 클래스 또는 밀접한 클래스들의 집합을 두개의 개별 계층구조로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴이다.
문제
Shape
를 상속받는 Circle
과 Square
가 있다. 여기서 색상을 추가하면 BlueCircle
, RedCircle
, BlueSquare
, RedSquare
가 생길 수가 있다. 그러나 모양이 하나 추가될 때마다 2개의 새로운 클래스가 생기며 색상이 하나 더 생기면 각 3개씩 모양을 추가해야한다. 이러한 기하급수적으로 늘어나는 경우 코드가 복잡해진다
해결책
이러한것은 모양과 색상의 두 가지 독립적인 차원에서 모양 클래스들을 확장하려고 하기 때문에 발생한다.
브리지 패턴은 상속에서 객체 합성으로 전환해 이 문제를 해결하려고 한다. 색상이나 모양의 차원 중 하나를 계층구조로 추출하여 원래 클래스들이 한 클래스 내에서 모든 상태와 행동들을 갖는 대신 새 계층구조의 객체를 참조하도록 하는 것이다.
이 방식이면 색상 관련 코드를 Red, Blue라는 두개의 자식 클래스들이 있는 자체 클래스로 추출할 수 있다. 그리고 모양 클래스가 색을 참조 필드로 가진다면 이 두 객체사이에 브리지가 생긴다.
추상화와 구현
추상화(인터페이스)는 일부 개체(entity)에 대한 상위 수준의 제어 레이어이다. 이 레이어는 실제 작업을 수행하는건 아니고 작업할 구현 레이어(플랫폼)에 위임해야한다. 여기서 말하는 추상화는 Java 레벨의 인터페이스나 추상 클래스가 아니다. 예를들어 추상화는 그래픽 사용자 인터페이스이고, 구현은 그래픽 사용자 인터페이스 레이어가 사용자와 상호작용하여 그 결과로 호출하는 API이다.
이러한 앱은 두가지 독립적인 방향으로 확장할 수 있다
- 다른 여러가지 그래픽 인터페이스를 가진다
- 여러 다른 API 들을 지원한다
구조
- 추상화는 상위 수준의 제어 논리를 제공한다. 구현 객체가 실제 작업을 수행한다
- 구현은 모든 구상 클래스들에 공통적인 인터페이스를 가지며 추상화는 여기에 선언된 메서드들만 통해 소통할 수 있다
- 구상 구현들에는 플랫폼별 맞춤형 코드가 포함된다
- 정제 추상화는 제어 논리의 변형들을 제공한다.
- 일반적으로 클라이언트는 추상화와 작업하는데만 관심이 있다. 그러나 추상화 객체를 구현 객체들 중 하나와 연결하는 것도 클라이언트의 역할이다.
언제사용?
브리지 패턴은 어떤 기능의 여러 변형을 가진 모놀리식 클래스를 나누고 정돈하려고 할 때 사용한다.
여러 독립 차원에서 클래스를 확장해야 할 때 사용한다
런타임에 구현을 전환할 수 있어야할 때 사용한다
장단점
플랫폼 독립적인 클래스들과 앱들을 만들 수 있다.
상위 수준의 추상화를 통해 작동하고 플랫폼 세부정보에 노출되지 않는다
개방폐쇄 원칙을 지킨다
단일책임 원칙을 지킨다
결합도가 높은 클래스에 패턴을 적용하면 코드가 복잡해진다