디자인 패턴

Bridge Pattern

kyoulho 2024. 4. 10. 13:42

브리지 패턴은 구현부와 추상화를 분리하여 두 부분이 독립적으로 변형될 수 있도록 하는 패턴이다.

장점

  • 구현과 인터페이스를 완전히 결합하지 않았기에 구현과 추상화 부분을 분리할 수 있다.
  • 추상화된 부분과 실제 구현 부분을 독립적으로 확장할 수 있다.
  • 추상화 부분을 구현 구상 클래스가 바뀌어도 클라이언트에는 영향을 끼치지 않는다.

단점

  • 디자인이 복잡해진다는 단점이 있다.

브리지 패턴이 사용되는 상황

  • 추상화와 구현의 분리가 필요한 경우
    • 시스템의 일부분이 다양한 방식으로 구현될 수 있고, 이 구현들이 독립적으로 확장 및 변경되어야 할 때.
  • 클래스 계층 구조의 확장이 어려운 경우
    • 상속을 통한 구현부의 변경이 어려운 경우에 브리지 패턴은 상속을 대신하여 사용될 수 있다.

예제

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();
    }
}

'디자인 패턴' 카테고리의 다른 글

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