Design Patterns

[Design Patterns] Bridge

우라릭 2024. 3. 16. 22:19

목차

    개요

    이번 글에선 Object Structural Pattern인 브릿지 패턴에 대해 알아보겠습니다

    내용

    요약

    둘이 독립적으로 있을 수 있게 구현과 추상화를 분리하자

    예시

    디자인 패턴의 예시에서 단골로 나오는 GUI 프레임워크를 다시 생각해봅시다. 사용자의 입력을 받는 Input 컴포넌트를 만들어야 한다고 가정하면, 아래와 같은 구조가 나올 수 있습니다.

    위 구조의 문제점은 구현과 추상화가 섞여있다는 것입니다. Input, TextInput은 추상화인 반면에 MacInput, WindowsInput, MacTextInput, WindowsTextInput은 구현체입니다. 이렇게 되면 개발/유지보수시에 몇 가지 치명적인 단점이 있습니다.

    • 새로운 인터페이스(추상화)를 추가하기가 불편합니다. 
    • 사용자의 코드를 플랫폼 의존적이게 만듭니다. 다만 이 문제는 생성형 패턴들을 사용해서 해결할 수도 있습니다.

    위 문제를 해결하기 위해서 구현과 추상화를 분리하는 것이 브릿지 패턴입니다.

    Input과 그 서브클래스의 모든 연산은 InputImpl이라는 인터페이스의 연산을 이용해서 구현합니다. 이 방법은 플랫폼에 종속적인 구현과 Input 추상화를 분리시킬 수 있습니다. 여기서 추상화가 꼭 인터페이스일 필요는 없다는 사실을 알아두세요!

    위 구조에서 Input과 InputImpl의 관계를 브릿지라고 합니다. 구현과 추상화를 이어주기 때문이지요.

    구조

     

    간단히 생각하면 아래 코드를

            A
         /     \
        Aa      Ab
       / \     /  \
     Aa1 Aa2  Ab1 Ab2

    아래와 같이 리팩토링한다고 생각하시면 됩니다.

         A         N
      /     \     / \
    Aa(N) Ab(N)  1   2

    출처) https://stackoverflow.com/a/9406293

     

    이야깃거리

    언제 써야 할까?

    • 구현체와 인터페이스가 모두 상속으로 확장 가능해야할 때
    • 구현체의 변화가 사용자에게 영향을 미치면 안될 때
    • 첫 번째 예제처럼 클래스가 너무 많아질 때

    장단점

    • (Pros) 사용자에게 사용하기 쉬운 추상화된 클래스를 제공할 수 있음.
    • (Cons) 구조를 복잡하게 만듦.

    Case Study

    Case 1. JDBC Drivers

    JDBC는 자바에서 데이터베이스에 접근하여 SQL을 실행할 수 있게 해주는 API입니다. 해당 API(Application Programming Interface)를 구현하는 클래스를 JDBC 드라이버라고 합니다. 

    자바 개발자는 응용 프로그램을 개발할 때 이런 JDBC 드라이버를 신경쓰지 않고 추상화된 JDBC API만 사용하여 개발할 수 있습니다. 이는 전형적인 브릿지 패턴의 한 예라고 볼 수 있습니다.

     

    Case 2. Slf4j

    Slf4j는 Simple Logging Facade for Java의 줄임말로 자바의 다양한 로깅 프레임워크의 퍼사드 혹은 추상화를 제공합니다. 하지만 이 API 역시 브릿지 패턴의 한 예로 볼 수 있습니다.

    위 다이어그램에서 Log4jServiceProvider의 이름은 실제로 Slf4jServiceProvider이지만 이해를 돕기 위해 이름을 임의로 수정했습니다. (코드) 사용자는 slf4j의 LoggerFactory를 통해 추상화된 Logger를 가져옵니다. 사용자는 어떤 구현체의 Logger를 가지고 있는지 신경쓸 필요 없습니다.

    출처

    GoF Design Patterns

    https://stackoverflow.com/questions/14888218/what-is-an-example-of-the-bridge-pattern-in-core-java

    https://www.informit.com/articles/article.aspx?p=29302

    'Design Patterns' 카테고리의 다른 글

    [Design Patterns] Decorator  (0) 2024.03.20
    [Design Patterns] Composite  (0) 2024.03.17
    [Design Patterns] Adapter  (0) 2024.03.16
    [Design Patterns] Singleton  (0) 2024.02.25
    [Design Patterns] Prototype  (0) 2024.02.25