# 브릿지 (Bridge) 패턴
# 브릿지 패턴이란 무엇인가요?
추상적인 것과 구체적인 것을 분리하여 연결하는 패턴이며, 추상화(abstraction)를 구현으로부터 분리하여 각각 독립적으로 변화할 수 있도록 합니다.
"두개의 다른 계층(하나는 추상, 하나는 구현인 서로다른 계층의 커플링을 약화시키며 협력은 가능하도록 하는 패턴"
- 사용측에서는 구현체를 사용하지 않고 추상적인 계층만을 사용하게 됩니다.
- 여기서 Abstraction은 고차원의 추상적인 로직을 담고 있는 클래스이며, 추상체 덕분에 해당 개념들은 다양한 변형체 또는 다른 계층구조로 확장될 수 있습니다.
- Implementation은 구체적인 정보, 상태, 액션 혹은 플랫폼에 특화된 코드를 담으며, concrete implementation으로 구체화된다.
# Abstraction
- 기능 계층의 최상위 클래스이며 추상 인터페이스를 정의한다. Implementation에 대한 레퍼런스를 유지한다.
- 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현부분의 메서드를 호출한다.
# RefinedAbstraction
- Abstraction에 의해 정의된 인터페이스를 확장한다.(extends)
- 기능 계층에서 새로운 부분을 확장한 클래스이다.
# Implementation
- 구현 클래스를 위한 인터페이스를 정의한다.
- Abstraction의 기능을 구현하기 위한 인터페이스 정의한다.
# ConcreteImplementation
- Implementor 인터페이스를 구현 즉, 실제 기능을 구현한다.
# 예제 코드
- Implementation
public interface Skin {
String getName();
}
- ConcreteImplementation
public class KDA implements Skin {
@Override
public String getName() {
return "KDA";
}
}
- Abstraction
public interface Champion {
void skillQ();
void skillW();
}
public class DefaultChampion implements Champion {
private Skin skin;
private String name;
public DefaultChampion(Skin skin, String name) {
this.skin = skin;
this.name = name;
}
@Override
public void skillQ() {
System.out.printf("%s %s Q\n", skin.getName(), this.name);
}
@Override
public void skillW() {
System.out.printf("%s %s W\n", skin.getName(), this.name);
}
@Override
public String getName() {
return null;
}
}
- RefinedAbstraction
public class 아리 extends DefaultChampion {
public 아리(Skin skin) {
super(skin, "아리");
}
}
- 실 사용 예시
public class Main {
public static void main(String[] args) {
Champion kda아리 = new 아리(new KDA());
kda아리.skillQ();
kda아리.skillW();
}
}
# 어댑터 패턴과 다른 것은 무엇인가요?
두 패턴 모두 Interface의 detail을 감추고자 하며, 구조적인 차이가 없으나, 어댑터 패턴은 서로 다른 두 가지를 연결하는 것이라면, 브릿지 패턴은 추상적인 것과 구체적인 것을 연결합니다.
# 브릿지 패턴의 장점과 단점은 무엇인가요?
장점
- 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다.
- OCP객체 디자인 원칙을 준수할 수 있다.
- 추상적인 코드과 구체적인 코드를 분리하여 개발할 수 있다.
- Single responsebility
단점
- 계층 구조가 늘어나 복잡도가 증가할 수 있다
# 브릿지 패턴의 예시는 무엇인가요?
- JDBC API, DriverManger와 Driver
- 새로운 DB가 추가되어 Driver가 추가되어도 추상화 되어있는 곳은 변경이 되지 않는다.
# 참고자료
출처: https://www.crocus.co.kr/1537 [Crocus]
출처: https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4 [GOF 디자인패턴]