본문 바로가기

JAVA/GOF Design Pattern

GOF 브릿지 패턴

SMALL

브릿지 패턴(Bridge Pattern)은 객체 지향 디자인 패턴 중 하나로, 추상화와 구현을 분리하는 패턴입니다. 이 패턴은 기능적인 계층과 구현적인 계층을 분리하여 각각 독립적으로 확장 및 변경할 수 있도록 합니다.

브릿지 패턴의 구성 요소는 다음과 같습니다.

  • Abstraction: 추상화 계층을 정의하는 인터페이스 역할을 합니다. 추상화 계층은 구현적인 세부 정보를 모르고도 사용 가능한 기능적인 인터페이스를 제공합니다.
  • RefinedAbstraction: Abstraction 인터페이스를 확장하여 기능을 추가하는 역할을 합니다.
  • Implementor: 구현 계층을 정의하는 인터페이스 역할을 합니다. 구현 계층은 추상화 계층에 의존하지 않고 독립적으로 확장 및 변경할 수 있는 인터페이스를 제공합니다.
  • ConcreteImplementor: Implementor 인터페이스를 구현하는 클래스입니다. 실제 구현을 담당합니다.

자바에서 브릿지 패턴을 구현하기 위해서는 추상화 계층과 구현 계층을 모두 인터페이스로 정의하고, 추상화 계층의 인터페이스를 구현한 클래스에서 구현 계층의 인터페이스를 구현하는 방식으로 구현합니다.

다음은 간단한 예제 코드입니다.

 

 

 

// Implementor interface
interface DrawingAPI {
    public void drawCircle(double x, double y, double radius);
}

// ConcreteImplementor 1 class
class DrawingAPI1 implements DrawingAPI {
    @Override
    public void drawCircle(double x, double y, double radius) {
        System.out.printf("API1.circle at %f:%f radius %f\n", x, y, radius);
    }
}

// ConcreteImplementor 2 class
class DrawingAPI2 implements DrawingAPI {
    @Override
    public void drawCircle(double x, double y, double radius) {
        System.out.printf("API2.circle at %f:%f radius %f\n", x, y, radius);
    }
}

// Abstraction class
abstract class Shape {
    protected DrawingAPI drawingAPI;
   
    protected Shape(DrawingAPI drawingAPI) {
        this.drawingAPI = drawingAPI;
    }
   
    public abstract void draw();
    public abstract void resizeByPercentage(double pct);
}

// RefinedAbstraction class
class CircleShape extends Shape {
    private double x, y, radius;
   
    public CircleShape(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);
    }

    @Override
    public void resizeByPercentage(double pct) {
        radius *= (1.0 + pct / 100.0);
    }
}

public class Bridge {
    public static void main(String[] args) {
        Shape circle1 = new CircleShape(1, 2, 3, new DrawingAPI1());
        Shape circle2 = new CircleShape(5, 7, 11, new DrawingAPI2());
 
        circle1.resizeByPercentage(2.5);
        circle1.draw();
 
        circle2.resizeByPercentage(2.5);
        circle2.draw();
    }
}

 

위 코드에서 DrawingAPI는 구현 계층의 인터페이스이며, DrawingAPI1DrawingAPI2DrawingAPI를 구현한 클래스입니다.

 

Shape는 추상화 계층의 인터페이스이며, CircleShapeShape를 구현한 클래스입니다. CircleShape는 생성자에서 DrawingAPI를 인자로 받아 구현 계층의 인터페이스를 활용합니다. 이를 통해 구현 계층과 추상화 계층이 분리되어 각각 독립적으로 확장이 가능해집니다.

 

CircleShape는 Shape의 구현체입니다. CircleShape는 생성자에서 DrawingAPI를 인자로 받으며, 이를 통해 구현 계층의 drawCircle() 메소드를 호출할 수 있습니다.

 

위 예시에서는 CircleShape를 생성할 때 DrawingAPI1과 DrawingAPI2를 각각 넘겨주어, 서로 다른 두 개의 구현 계층을 사용하고 있습니다. 이를 통해, 같은 추상화 계층(Shape)을 사용하면서도 구현 계층(DrawingAPI)을 다르게 사용할 수 있습니다.

LIST

'JAVA > GOF Design Pattern' 카테고리의 다른 글

GOF 어댑터 패턴  (0) 2023.05.10
GOF 프로토타입 패턴  (0) 2023.05.10
GOF 중재자(Mediator) 패턴  (0) 2023.05.09
GOF Builder Pattern  (0) 2023.05.09
GOF 스트레티지 패턴(Strategy Pattern)  (0) 2023.05.09