브리지 패턴
IT위키
더 많은 작업
- 상위 문서: 소프트웨어 디자인 패턴
브리지 패턴(Bridge Pattern)은 기능을 나타내는 추상화 계층과 그 기능을 실제로 수행하는 구현 계층을 별도의 클래스 계층으로 나누고 둘을 위임(참조)으로 연결해, 두 계층이 서로 독립적으로 확장될 수 있게 하는 GoF 구조 패턴이다.
기능과 구현을 상속 하나로 묶으면 조합마다 클래스가 생긴다. 예를 들어 도형(원, 사각형)과 그리기 방식(화면, 프린터)을 상속으로만 나누면 '화면용 원', '프린터용 원', '화면용 사각형', '프린터용 사각형'처럼 m × n 개의 클래스가 필요하다. 브리지 패턴은 도형 계층과 그리기 계층을 따로 두고, 도형이 그리기 객체를 참조하게 한다. 그러면 m + n 개의 클래스로 같은 조합을 만들 수 있고, 새 도형이나 새 출력 장치를 추가해도 다른 쪽을 고치지 않는다. 두 섬(계층)을 다리(참조)로 잇는 모양이라 브리지라는 이름이 붙었다.
GoF 분류에서 브리지는 클래스와 객체를 묶어 더 큰 구조를 만드는 구조 패턴으로, 어댑터, 컴포지트, 데코레이터, 퍼사드, 플라이웨이트, 프록시와 함께 일곱 가지다.
| 역할 | 설명 |
|---|---|
| Abstraction | 기능 계층의 최상위. Implementor 객체를 참조로 가지고 있고, 실제 작업은 그 객체에 맡긴다 |
| RefinedAbstraction | Abstraction 을 상속해 기능을 늘린 클래스 |
| Implementor | 구현 계층의 인터페이스. Abstraction 이 쓰는 기본 연산을 선언한다 |
| ConcreteImplementor | Implementor 를 실제로 구현한 클래스(운영체제별, 장치별 구현 등) |
interface Renderer { // Implementor
void drawCircle(int r);
}
class ScreenRenderer implements Renderer { // ConcreteImplementor
public void drawCircle(int r) { System.out.println("화면에 반지름 " + r + " 원"); }
}
class PrinterRenderer implements Renderer {
public void drawCircle(int r) { System.out.println("종이에 반지름 " + r + " 원"); }
}
abstract class Shape { // Abstraction
protected Renderer renderer; // 구현 계층으로 놓인 다리
Shape(Renderer renderer) { this.renderer = renderer; }
abstract void draw();
}
class Circle extends Shape { // RefinedAbstraction
private int r;
Circle(Renderer renderer, int r) { super(renderer); this.r = r; }
void draw() { renderer.drawCircle(r); }
}
// 사용: 도형과 출력 방식을 실행 중에 자유롭게 조합한다
new Circle(new ScreenRenderer(), 5).draw();
new Circle(new PrinterRenderer(), 5).draw();
| 구분 | 브리지 | 어댑터 |
|---|---|---|
| 목적 | 추상화와 구현을 처음부터 나누어 따로 확장 | 이미 있는 클래스의 맞지 않는 인터페이스를 맞춤 |
| 적용 시점 | 설계 단계 | 기존 코드를 재사용할 때(사후) |
| 공통점 | 둘 다 구조 패턴이고, 한 객체가 다른 객체에 일을 위임한다 | |
- 추상화와 구현을 독립적으로 바꾸거나 늘릴 수 있다(상속 대신 합성)
- 구현을 실행 중에 바꿔 끼울 수 있고, 클라이언트에 구현 세부를 숨긴다
- 계층이 둘로 나뉘어 처음 설계가 복잡해진다