-
Bridge Pattern(브리지 패턴)STUDY/디자인패턴 2024. 12. 8. 19:38
브리지 패턴이란?
큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴
** 여기서 추상화 및 구현은 프로그래밍 언어에서의 추상화 클래스와 인터페이스를 의미하는 것이 아님.
문제
Circle 및 Square라는 한쌍의 자식 클래스들이 있는 Shape 클래스가 있다고 가정하자. 이 클래스 계층 구조를 확장하여 색상을 도입하기 위해 Red 및 Blue 모양들의 자식 클래스들을 만들 계획이다. 하지만 이미 두 개의 자식 클래스가 있으므로 BlueCircle, RedSquare와 같은 네 가지의 클래스 조합을 만들어야 한다.
여기서 문제는 새로운 모양 유형들과 색상 유형들을 추가할 때마다 계층 구조가 기하급수적으로 성장해, 유형들이 많아질수록 코드가 점점 복잡해진다는 것이다.
해결책
브리지 패턴은 두 가지 독립적인 차원 중 하나를 별도의 클래스 계층구조로 추출하여 원래 클래스들이 한 클래스 내에서 모든 상태와 행동들을 갖는 대신 새 계층구조의 객체를 참조하도록 한다.
색상 관련 코드를 Red, Blue 라는 두 개의 자식 클래스들이 있는 자체 클래스로 추출하고, Shape 클래스는 색상 객체들 중 하나를 가리키는 참조 필드를 갖는다. Shape는 연결된 색상 객체에 모든 색상 관련 작업을 위임할 수 있다. 이 참조가 Shape와 Color 클래스들 사이의 브리지 역할을 하게 된다.
구조
- 추상화(Abstraction) : 기능 클래스
추상화는 고수준의 인터페이스를 정의하는 역할을 한다. 클라이언트와의 상호작용을 담당하고, 실제 동작을 구현 클래스(Implementor)로 위임한다. 즉, 추상화 클래스는 클라이언트가 사용할 수 있는 기능를 제공하지만, 그 내부 동작은 구현 클래스가 처리하도록 한다. 추상화는 구현에 의존하지만, 두 계층은 독립적으로 변할 수 있다.
- 정제된 추상화(Refined Abstraction)
상속을 통해 추상화 클래스를 확장하여 구체적인 기능을 정의할 수 있다.
- 구현(Implementation) : 구현 클래스
구현은 추상화가 실제로 어떤 방식으로 동작할지 구체적으로 정의하는 인터페이스로, 독립적으로 변경 및 확장될 수 있으며, 추상화는 이에 영향을 받지 않는다.
- 구현체(Concrete Implementations)
인터페이스를 구현한 클래스로, 다양한 방식으로 실제 동작을 정의한다.
- 클라이언트(Client)
추상화와 작업하고, 추상화 객체를 구현 객체들 중 하나와 연결하는 역할을 한다.
예시
public interface Color { void fill(); } public class Red implements Color { @Override public void fill() { System.out.println("Fill with Red color"); } } public class Blue implements Color { @Override public void fill() { System.out.println("Fill with Blue color"); } }
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); } public class Circle extends Supplies { public Circle(Color color) { super(color); } @Override public void draw() { System.out.print("Draw Circle, "); color.fill(); } } public class Rectangle extends Supplies { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.print("Draw Rectangle, "); color.fill(); } }
public class Client { public static void main(String[] args) { Shape redCircle = new Circle(new Red()); redCircle.draw(); Shape blueCircle = new Circle(new Blue()); blueCircle.draw(); Shape redRectangle = new Rectangle(new Red()); redRectangle.draw(); Shape blueRectangle = new Rectangle(new Blue()); blueRectangle.draw(); } }
장단점
장점
- 클라이언트 코드는 상위 수준의 추상화를 통해 작동하며, 실제 구현 방식은 노출되지 않는다.
- 단일 책임 원칙 : 추상화의 상위 수준 논리와 구현의 구체적인 동작을 분리하여 각각의 클래스가 한 가지 책임만 가지도록 한다.
- 개방/폐쇄 원칙 : 새로운 추상화들과 구현들을 상호 독립적으로 확장할 수 있다.
단점
- 결합도가 높은 클래스에 패턴을 적용하여 코드를 더 복잡하게 만들 수 있다.
'STUDY > 디자인패턴' 카테고리의 다른 글
Decorator Pattern(데코레이터 패턴) (0) 2024.12.25 Composite Pattern(복합체 패턴) (0) 2024.12.25 Adapter Pattern(어댑터 패턴) (0) 2024.12.08 Singleton Pattern(싱글턴 패턴) (0) 2024.11.26 Prototype Pattern(프로토타입 패턴) (0) 2024.11.26