브릿지 패턴은 구현(implementation)으로부터 추상(abstraction) 레이어를 분리하여 이 둘이 서로 독립적으로 변화할 수 있도록 한다.
즉, 기능과 구현에 대해 두 개를 별도의 클래스로 구현 한다
기능 클래스 계층 ||=========|| 구현클래스 계층
아래 그림처럼 인터페이스, 구현 모두에 인터페이스 계층 구조가 있다고 가정하자
Shape의 구현체인 Triangle, Pentagon에서 다시 Color를 라는 추상층이 존재하는 이 상황은 코드의 독립적인 변형이 힘들고, 확장이 어렵다
package BridgePattern;
public abstract class Shape {
// 구현
// Shape와 Color(인터페이스)의 다리 역할
protected Color color;
public Shape(Color c){
this.color=c;
}
abstract public void applyColor();
}
applyColor()
는 추상 메서드public class Triangle extends Shape{
public Triangle(Color c) {
super(c);
}
@Override
public void applyColor() {
System.out.print("Triangle filled with color ");
color.applyColor();
}
}
public class Pentagon extends Shape{
public Pentagon(Color c) {
super(c);
}
@Override
public void applyColor() {
System.out.print("Pentagon filled with color ");
color.applyColor();
}
}
applyColor()
를 @Override
applyColor()
public interface Color {
public void applyColor();
}
public class RedColor implements Color{
public void applyColor(){
System.out.println("red.");
}
}
public class GreenColor implements Color{
public void applyColor(){
System.out.println("green.");
}
}
public static void main(String[] args) {
Shape tri = new Triangle(new RedColor()); // 어떤 색을 사용할지 주입
tri.applyColor();
Shape pent = new Pentagon(new GreenColor());
pent.applyColor();
}
우선 두 패턴 모두 Interface의 detail을 숨기는데는 구조적인 차이가 없다
그러나 목적의 차이가 있는데
어댑터 패턴의 경우 이미 제공된 코드를 그대로 사용할 수 없을때, 필요한 형태로 변환한 후 이용하는 경우로, '이미 제공된 것'과 '필요한 것'사이의 '차이'를 메우는게 Adapter Pattern
브릿지 패턴은 추상과 구현을 분리하는데 목적이 있다 = 덕분에 추상은 추상대로 구현은 구현대로 변경해도 서로 영향을 주지 않는다
어댑터는 기존코드를 필요한 형태로 변환을 위해, 브릿지는 확장성을 위해 미리 추상과 구현을 분리하는데 사용
https://www.crocus.co.kr/1537
https://beomseok95.tistory.com/257
https://m.blog.naver.com/tradlinx0522/220928963011
https://lktprogrammer.tistory.com/35