브릿지 패턴(Bridge Pattern)
브릿지 패턴은 아래와 같이 정의한다.
"구현(implementation)으로부터 추상(abstraction) 레이어를 분리하여 이 둘이 서로 독립적으로 변화할 수 있도록 한다."
"구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 한다.
즉 기능과 구현에 대해서 두 개를 별도의 클래스로 구현을 한다."
"두개의 다른 계층(하나는 추상, 하나는 구현인 서로다른 계층의 커플링을 약화시키며 협력은 가능하도록 하는 패턴"
브릿지 패턴 클래스 다이어그램

Abstraction
- 기능 계층의 최상위 클래스이며 추상 인터페이스를 정의한다. Implementor에 대한 레퍼런스를 유지한다.
- 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현부분의 메서드를 호출한다.
RefinedAbstraction
- Abstraction에 의해 정의된 인터페이스를 확장한다.(extends)
- 기능 계층에서 새로운 부분을 확장한 클래스이다.
Implementor
- 구현 클래스를 위한 인터페이스를 정의한다.
- Abstraction의 기능을 구현하기 위한 인터페이스 정의한다.
ConcreteImplementor
- Implementor 인터페이스를 구현 즉, 실제 기능을 구현한다.
브릿지 패턴 예제
아래의 다이어그램을 보면 훨씬 더 쉽게 이해 할 수 있다.

Shape 추상 클래스
draw만 추상 메서드이고 그 외에는 추후 나올 Drawing 인터페이스의 메서드를 따르도록 되어있다.
이때 구현부는 인터페이스로 모두 위임(Delegation)함으로써 브릿지 패턴의 특성을 나타내고있다.
package BridgePattern; public abstract class Shape { private Drawing drawing; protected Shape(Drawing drawing) { this.drawing = drawing; } public abstract void draw(); public void drawLine(int x, int y) { drawing.drawLine(x, y); } public void fill() { drawing.fill(); } }
Rectangle 클래스
package BridgePattern; public class Rectangle extends Shape{ protected Rectangle(Drawing drawing) { super(drawing); } @Override public void draw() { System.out.println("Rect draw extend"); } }
Circle 클래스
package BridgePattern; public class Circle extends Shape{ protected Circle(Drawing drawing) { super(drawing); } @Override public void draw() { System.out.println("Rect draw extend"); } }
Drawing 인터페이스
package BridgePattern; public interface Drawing { public void drawLine(int x, int y); public void fill(); }
RectDrawing 클래스
package BridgePattern; public class RectDrawing implements Drawing{ @Override public void drawLine(int x, int y) { System.out.println("Rect Draw line from " + x + " to " + y); } @Override public void fill() { System.out.println("Rect Fill!"); } }
CircleDrawing 클래스
package BridgePattern; public class CircleDrawing implements Drawing{ @Override public void drawLine(int x, int y) { System.out.println("Circle Draw line from " + x + " to " + y); } @Override public void fill() { System.out.println("Circle Fill!"); } }
BridgeMain 클래스
package BridgePattern; public class BridgeMain { public static void main(String[] args) { Shape rectangle = new Rectangle(new RectDrawing()); Shape circle = new Circle(new CircleDrawing()); rectangle.drawLine(1, 2); rectangle.fill(); rectangle.draw(); System.out.println(); circle.drawLine(3, 4); circle.fill(); circle.draw(); } }
브릿지 패턴과 어댑터 패턴의 차이
두 패턴 모두 Interface의 detail을 감추고자 하며, 구조적인 차이가 없다.
하지만 두 패턴은 서로 사용하고자 하는 목적의 차이가 분명하다.
- 어댑터는 어떤 클래스의 인터페이스가 다른 코드에서 기대하는 것과 다를 때(기능은 같은 데, 함수명이 다를 때) 어댑터를 중간에 두어 맞춰주는 것이다.
- 브릿지는 추상과 구현을 분리하는 것이다.(추상 클래스는 추상 클래스 대로, 구현은 구현 대로 변경해도 서로 영향을 주지 않도록 한다.)
- 어댑터는 결국 어떤 코드에 맞게끔 기존의 코드를 쓰기 위해 사용되고, 브릿지는 확장성을 고려하여 미리 예상하여 bridge class를 구현해 코드 작성시 사용되어진다.
https://donxu.tistory.com/entry/%EB%B8%8C%EB%A6%BF%EC%A7%80-%ED%8C%A8%ED%84%B4-Bridge-pattern
'Applied > Design Pattern' 카테고리의 다른 글
MVC 패턴(Model View Controller Pattern) (0) | 2019.07.20 |
---|---|
상태 패턴(State Pattern) (0) | 2019.07.18 |
어댑터 패턴(Adapter Pattern) (0) | 2019.07.10 |
팩토리 패턴(Factory Pattern) (0) | 2019.07.09 |
중재자 패턴(Mediator Pattern) (0) | 2019.07.07 |