구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 하는 패턴
즉, 기능과 구현에 대해 두 개를 별도의 클래스로 구현
RefinedAbstraction: 기능 계층에서 새로운 부분을 확장한 클래스입니다.
두 구체 클래스 간의 강한 결합을 제거하기 위해서 사용합니다.
두 클래스는 추상화된 상위 클래스 또는 인터페이스를 가지게 되고, 의존성은 상위 클래스 간에서 이루어집니다.
이를 통해 실제 의존성이 발생하더라도 서로의 구체 타입은 알 수 없도록합니다. 이렇게 되면 두 상위 타입을 구현하는 어느 쪽도 변경 가능한 상태가 됩니다.
즉 두 클래스 간의 결합을 약하게 하고자 브릿지 패턴을 사용합니다.
간단한 예로 필기도구와 동작을 생각해봅시다.
필기구: pencil
동작: Write, Draw
위처럼 되었습니다.
코드로 살펴보겠습니다.
Draw with: Pencil
Write with: Pencil
코드에서 확인 가능하듯이 Abstraction, Implementor에서만 의존성이 존재하고 서브클래스에선 서로 독립적입니다.
브릿지 패턴을 이용하여 확장에 유연한 구조를 작성할 수 있었습니다.
어댑터에서도 멤버 변수로 Adaptee를 가지고 있던 것이 위의 Abstraction이 Implementor 변수를 가지는 것이 유사해 보입니다.
둘의 차이는 사용 목적에 있습니다.
즉 Adapter는 기존의 코드를 활용하기 위함이고 Bridge는 확장성을 고려한 코드 작성을 위함입니다.
참고
감사합니다.
Text by Chaelin. Photographs by Chaelin, Unsplash.