# 브릿지 (Bridge) 패턴

# 브릿지 패턴이란 무엇인가요?

추상적인 것과 구체적인 것을 분리하여 연결하는 패턴이며, 추상화(abstraction)를 구현으로부터 분리하여 각각 독립적으로 변화할 수 있도록 합니다.

"두개의 다른 계층(하나는 추상, 하나는 구현인 서로다른 계층의 커플링을 약화시키며 협력은 가능하도록 하는 패턴"

image

  • 사용측에서는 구현체를 사용하지 않고 추상적인 계층만을 사용하게 됩니다.
  • 여기서 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 디자인패턴]