본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

브리지 패턴(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();

어댑터 패턴과 구분

편집 원본 편집
구분 브리지 어댑터
목적 추상화와 구현을 처음부터 나누어 따로 확장 이미 있는 클래스의 맞지 않는 인터페이스를 맞춤
적용 시점 설계 단계 기존 코드를 재사용할 때(사후)
공통점 둘 다 구조 패턴이고, 한 객체가 다른 객체에 일을 위임한다
  • 추상화와 구현을 독립적으로 바꾸거나 늘릴 수 있다(상속 대신 합성)
  • 구현을 실행 중에 바꿔 끼울 수 있고, 클라이언트에 구현 세부를 숨긴다
  • 계층이 둘로 나뉘어 처음 설계가 복잡해진다