[Design Pattern] Bridge

[디자인 패턴][구조 패턴] 브릿지

Posted by ChaelinJ on April 13, 2021

Bridge

구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 하는 패턴
즉, 기능구현에 대해 두 개를 별도의 클래스로 구현

  • 구현하는 부분에서 구현의 방법을 여러 형태로 설계 가능
  • 추상화한 일부분도 여러 형태로 설계 가능
  • 즉 구현부, 추상층 각각을 확장에 유연합니다.

다이어그램

  • Abstraction: 기능 계층의 최상위 클래스로 추상 인터페이스를 정의합니다.
    • 구현 부의 클래스를 인스턴스로 가지고, 해당 인스턴스를 이용해 구현 부분의 메서드를 호출합니다.
  • RefinedAbstraction: 기능 계층에서 새로운 부분을 확장한 클래스입니다.

  • Implementor: 구현 클래스를 위한 인터페이스를 정의합니다.
    • Abstraction의 기능을 구현하기 위한 인터페이스
  • ConcreteImplementor: 실제 기능을 구현합니다.

브릿지의 사용 이유

두 구체 클래스 간의 강한 결합을 제거하기 위해서 사용합니다.

두 클래스는 추상화된 상위 클래스 또는 인터페이스를 가지게 되고, 의존성은 상위 클래스 간에서 이루어집니다.

이를 통해 실제 의존성이 발생하더라도 서로의 구체 타입은 알 수 없도록합니다. 이렇게 되면 두 상위 타입을 구현하는 어느 쪽도 변경 가능한 상태가 됩니다.

즉 두 클래스 간의 결합을 약하게 하고자 브릿지 패턴을 사용합니다.

브릿지의 이해 및 예제

간단한 예로 필기도구와 동작을 생각해봅시다.

기능

필기구: pencil

구현

동작: Write, Draw

위처럼 되었습니다.

코드로 살펴보겠습니다.

기능
구현
클라이언트
출력
Draw with: Pencil
Write with: Pencil

코드에서 확인 가능하듯이 Abstraction, Implementor에서만 의존성이 존재하고 서브클래스에선 서로 독립적입니다.

브릿지 패턴을 이용하여 확장에 유연한 구조를 작성할 수 있었습니다.

브릿지와 어댑터의 차이

어댑터에서도 멤버 변수로 Adaptee를 가지고 있던 것이 위의 Abstraction이 Implementor 변수를 가지는 것이 유사해 보입니다.

둘의 차이는 사용 목적에 있습니다.

  • Adapter는 서로 다른 두 클래스를 혼용해 사용하기 위해 변환을 해주는 패턴입니다.
  • Bridge는 추상과 구현을 분리해 각각의 확장을 쉽게 하기 위한 패턴입니다.

즉 Adapter는 기존의 코드를 활용하기 위함이고 Bridge는 확장성을 고려한 코드 작성을 위함입니다.


참고

감사합니다.

Text by Chaelin. Photographs by Chaelin, Unsplash.