학습 목표

  • 추상화(Abstraction)와 구현(Implementation)을 분리하는 방식을 이해한다.
  • 기능 확장과 구현 변경을 독립적으로 확장 가능한 구조를 설계하는 법을 학습한다.
  • 상속보다 조합(Composition)을 통한 유연한 설계 원칙을 습득한다.
  • 브리지 패턴이 필요한 상황과 사용하면 얻는 이점(클래스 폭발 방지, 확장성 향상 등)을 파악한다

사용 상황

  • 색상 변경 + 도형 종류 추가 등 복합 조합이 필요한 경우

예제

더보기
더보기

원을 그리는 모델에 종류를 브리지를 이용해서 변경해서 그리는 방법

  • 구현부 인터페이스
public interface DrawingAPI {
    void drawCircle(double x, double y, double radius);
}
  • 실제 구현체 ( 모델들 )
public class DirectXAPI implements DrawingAPI {
    @Override
    public void drawCircle(double x, double y, double radius) {
        System.out.println("DirectX - Draw Circle at (" + x + ", " + y + ") radius " + radius);
    }
}

public class OpenGLAPI implements DrawingAPI {
    @Override
    public void drawCircle(double x, double y, double radius) {
        System.out.println("OpenGL - Draw Circle at (" + x + ", " + y + ") radius " + radius);
    }
}
  • 추상화
public abstract class Shape {
    protected DrawingAPI drawingAPI;

    protected Shape(DrawingAPI drawingAPI) {
        this.drawingAPI = drawingAPI;
    }

    public abstract void draw();
}
  • 원 추상화
public class Circle extends Shape {
    private double x, y, radius;

    public Circle(double x, double y, double radius, DrawingAPI drawingAPI) {
        super(drawingAPI);
        this.x = x;
        this.y = y;
        this.radius = radius;
    }

    @Override
    public void draw() {
        drawingAPI.drawCircle(x, y, radius);
    }
}
  • 구현
public class Main {

    public static void main(String[] args) {
        Shape circle1 = new Circle(5, 10, 3, new OpenGLAPI());
        Shape circle2 = new Circle(6, 15, 4, new DirectXAPI());

        circle1.draw();
        circle2.draw();
    }
}

 

- Circle 객체에서 해당 객체를 그리는 실제 구현체를 변경하는 방법

 

마무리

실제 코드에서 이용하는 방법으로는 채팅과 같은 네이버톡톡, 카카오톡, 슬랙 같은 발송 객체가 달라지는 것 같이 쓰면 좋을 것 같다. 어뎁터 패턴으로 앞에 바꾸는 방식으로도 충분히 구현은 가능하겠지만 알아두어서 나쁘지 않은 패턴 같습니다.

+ Recent posts