C++공부/GoF의 디자인 패턴
가교(Bridge)
아헿헿헿
2022. 7. 6. 03:59
1. 용도
구현에서 추상을 분리하여, 이들이 독립적으로 다양성을 가질 수 있도록 합니다.
2. 활용성
- 추상적인 개념과 이에 대한 구현 사이의 지속적인 종속 관계를 피하고 싶을 때
- 추상적 개념과 구현 모두가 독립적으로 서브클래싱을 통해 확장되어야 할 때
- 추상적 개념에 대한 구현 내용을 변경하는 것이 다른 관련 프로그램에 아무런 영향을 주지 않아야 할 때
- 사용자들이 사용자에게 구현을 완벽하게 은닉하길 원할 때
- 클래스 계통에서 클래스 수가 급증하는 것을 방지하고자 할 때
3. Class Diagram과 구조
[Abstraction] - 추상적 개념에 대한 인터페이스를 제공하고 객체 구현자에 대한 참조자를 관리합니다.
[RefinedAbstraction] - 추상적 개념에 정의된 인터페이스를 확장합니다.
[Implementor] - 구현 클래스에 대한 인터페이스를 제공합니다.
[ConcreteImplementor] - 인터페이스를 구현하여 실제적인 구현 내용을 담습니다.
Abstraction 클래스가 사용자 요청을 Implementor 객체에 전달합니다.
4. 장단점
장점
- 인터페이스와 구현 분리 - 구현이 인터페이스에 얽매이지 않아 구현을 런타임에 수시로 변경가능하며, 컴파일 타임 의존성을 제거할 수 있으며 계층화도 가능해집니다.
- 확장성 제고- Abstraction과 Implementor를 독립적으로 확장할 수 있습니다.
- 구현 세부 사항을 사용자에게서 숨기기 - 상세한 구현 내용을 사용자에게서 은닉할 수 있습니다.
5. 구현 방법
- 하나의 Implementor - 구현 방법이 오로지 하나일 때는 Implementor를 추상 클래스로 정의하는 것은 불필요하지만, 추상적 개념과 구현부를 분리시키는 것은 클래스 구현의 변경에서 사용자를 독립시킬 수 있기에 의미를 가집니다.
- 정확한 Implementor 생성- Implementor 클래스가 여러 개 존재할 때, 어떤 클래스를 언제, 어떻게, 몇 개 생성할 지 잘 결정해야 합니다.
- Implementor 공유- 참조 카운터를 활용하여 공유시킵니다.
- 다중 상속 이용- 다중 상속을 이용하여 인터페이스와 구현을 합칠 수 있습니다.