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