브릿지 패턴(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 |