브리지 패턴은 구현부와 추상화를 분리하여 두 부분이 독립적으로 변형될 수 있도록 하는 패턴이다.
장점
- 구현과 인터페이스를 완전히 결합하지 않았기에 구현과 추상화 부분을 분리할 수 있다.
- 추상화된 부분과 실제 구현 부분을 독립적으로 확장할 수 있다.
- 추상화 부분을 구현 구상 클래스가 바뀌어도 클라이언트에는 영향을 끼치지 않는다.
단점
- 디자인이 복잡해진다는 단점이 있다.
브리지 패턴이 사용되는 상황
- 추상화와 구현의 분리가 필요한 경우
- 시스템의 일부분이 다양한 방식으로 구현될 수 있고, 이 구현들이 독립적으로 확장 및 변경되어야 할 때.
- 클래스 계층 구조의 확장이 어려운 경우
- 상속을 통한 구현부의 변경이 어려운 경우에 브리지 패턴은 상속을 대신하여 사용될 수 있다.
예제
interface Renderer {
// 원을 렌더링하는 메서드
void renderCircle(double x, double y, double radius);
}
class RasterRenderer implements Renderer {
// RasterRenderer의 역할에 따라 원을 렌더링하는 메서드 구현
@Override
public void renderCircle(double x, double y, double radius) {
System.out.printf("RasterRenderer.circle 위치: %f:%f 반지름: %f%n", x, y, radius);
}
}
class VectorRenderer implements Renderer {
// VectorRenderer의 역할에 따라 원을 렌더링하는 메서드 구현
@Override
public void renderCircle(double x, double y, double radius) {
System.out.printf("VectorRenderer.circle 위치: %f:%f 반지름: %f%n", x, y, radius);
}
}
abstract class Shape {
protected Renderer renderer;
// Shape의 추상 클래스는 Renderer를 가지고 있음으로써 Bridge 패턴의 일부분
protected Shape(Renderer renderer) {
this.renderer = renderer;
}
// 모든 도형에 대한 그리기 추상 메서드
abstract void draw();
}
class Circle extends Shape {
private final double x, y, radius;
// Circle은 Shape를 확장하면서 렌더러를 포함하며, 렌더러에게 원을 그리기 위임함으로써 Bridge 패턴의 일부분
public Circle(double x, double y, double radius, Renderer renderer) {
super(renderer);
this.x = x;
this.y = y;
this.radius = radius;
}
// 원을 그리는 메서드 구현
@Override
void draw() {
// 렌더러에게 그리기를 위임하여 렌더러와 구체적인 도형(Circle)이 서로 독립적으로 변화할 수 있도록 함
renderer.renderCircle(x, y, radius);
}
}
class BridgePatternExample {
public static void main(String[] args) {
// 다른 종류의 렌더러를 생성
Renderer vectorRenderer = new VectorRenderer();
Renderer rasterRenderer = new RasterRenderer();
// 렌더러를 사용하여 각기 다른 Circle 인스턴스를 생성하고 그림
new Circle(1, 2, 3, vectorRenderer).draw();
new Circle(5, 7, 11, rasterRenderer).draw();
}
}
728x90
'디자인 패턴' 카테고리의 다른 글
Decorator Pattern (0) | 2024.05.05 |
---|---|
Composite Pattern (1) | 2024.05.01 |
Command Pattern (0) | 2024.04.28 |
Chain Of Responsibility Pattern (0) | 2024.04.27 |
Adapter Pattern (0) | 2024.04.10 |