브릿지 패턴 (가교 패턴)
브릿지패턴이란
브릿지 패턴 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴입니다.
말로는 잘 와닿지 않는 개념이니, 그림과 함께 살펴보자
Circle(원) 및 Square(직사각형)라는 한 쌍의 자식 클래스들이 있는 기하학적 Shape(모양) 클래스가 있다고 가정하고, 이 클래스 계층 구조를 확장하여 색상을 도입하기 위해 Red(빨간색) 및 Blue(파란색) 모양들의 자식 클래스들을 만든다고 하자. 그러나 Shape에는 이미 두 개의 자식 클래스가 있으므로 BlueCircle(파란색 원) 및 RedSquare(빨간색 직사각형)와 같은 네 가지의 클래스 조합을 만들어야 한다.
그래서 브릿지 패턴은 상속에서 객체 합성으로 전환하여 이 문제를 해결하려고 한다. 이것이 의미하는 바는 차원 중 하나를 별도의 클래스 계층구조로 추출하여 원래 클래스들이 한 클래스 내에서 모든 상태와 행동들을 갖는 대신 새 계층구조의 객체를 참조하도록 한다는 것입니다.
클래스 계층구조의 기하급수적인 성장을 방지하기 위하여 그것을 여러 관련 계층구조들로 변환할 수 있습니다.
이 접근 방식을 따르면, 색상 관련 코드를 Red 및 Blue라는 두 개의 자식 클래스들이 있는 자체 클래스로 추출할 수 있습니다. 그런 다음 Shape 클래스는 색상 객체들 중 하나를 가리키는 참조 필드를 받습니다. 이제 모양은 연결된 색상 객체에 모든 색상 관련 작업을 위임할 수 있다. 이 참조는 Shape 및 Color 클래스들 사이의 브리지(다리) 역할을 할 것이다. 이제부터 새 색상들을 추가할 때 모양 계층구조를 변경할 필요가 없으며 그 반대의 경우도 마찬가지다.
public interface Color {
String fill();
}
public class Red implements Color {
@Override
public String fill() {
return "발간색";
}
}
public class Blue implements Color {
@Override
public String fill() {
return "파란색";
}
}
public abstract class Brush {
protected Color color;
protected Brush(Color color) {
this.color = color;
}
public abstract String draw();
}
public class HBPencil extends Brush {
public static final String type = "[HB 연필]";
public HBPencil(Color color) {
super(color);
}
@Override
public String draw() {
return type + " " + color.fill();
}
}
public class MonoLine extends Brush {
public static final String type = "[모노라인]";
public MonoLine(Color color) {
super(color);
}
@Override
public String draw() {
return type + " " + color.fill();
}
}
브릿지패턴의 장단점
장점
- 플랫폼 독립적인 클래스들과 앱들을 만들 수 있다.
- 클라이언트 코드는 상위 수준의 추상화를 통해 작동하며, 플랫폼 세부 정보에 노출되지 않는다.
- 개방/폐쇄 원칙. 새로운 추상화들과 구현들을 상호 독립적으로 도입할 수 있다.
- 단일 책임 원칙. 추상화의 상위 수준 논리와 구현의 플랫폼 세부 정보에 집중할 수 있다.
단점
- 결합도가 높은 클래스에 패턴을 적용하여 코드를 더 복잡하게 만들 수 있다.