구조 패턴 - 브릿지 패턴

브릿지 패턴 소개: 브릿지 패턴은 구조적 설계 패턴 중 하나로, 실제 세계에서 "다리"가 강 양쪽을 연결하는 주요 교통 수단인 것처럼, 이 패턴도 두 부분을 연결하는 역할을 합니다. 소프트웨어 설계에서도 유사하게 추상화와 구현을 분리하여 연결합니다.

브릿지 패턴 정의: 추상화 부분(Abstraction)과 구현 부분(Implementation)을 분리하여, 각각이 독립적으로 변화할 수 있도록 합니다.

브릿지 패턴 사용 시나리오: 정의에서 알 수 있듯이, "다리"의 역할은 추상화와 구현을 연결하는 것입니다. 사실, 다차원으로 변화하는 클래스들 또는 여러 트리 구조 클래스 간의 결합을 해소할 때 브릿지 패턴을 사용할 수 있습니다. 시스템이 구성 요소의 추상화 역할과 구체화 역할 간에 더 많은 유연성을 필요로 하고, 두 계층 간에 정적 상속 관계를 설정하는 것을 피하려는 경우 브릿지 패턴을 통해 추상화 계층에서 연결 관계를 구축할 수 있습니다. 상속 사용을 원하지 않거나 다중 계층 상속으로 인해 클래스 수가 급격히 증가하는 시스템에서도 브릿지 패턴을 고려할 수 있습니다. 또한 하나의 클래스가 독립적으로 변화하는 두 가지 차원을 가지고 있고, 이 두 차원 모두 확장이 필요한 경우에도 사용됩니다.

아래는 생활 속 그림 그리기 예시입니다: 그림을 그릴 때, 크기 면에서 대, 중, 소 세 가지 크기의 붓이 있고, 색상 면에서 빨간색, 파란색, 초록색이 있습니다. 그림 그리기라는 행위에서, 큰 빨간 붓이나 작은 초록 붓을 사용할 수 있으며, 매우 유연합니다. 하나의 클래스에 크기와 색상이라는 두 가지 변화 차원이 존재합니다. 또한 크기와 색상 모두 확장 가능합니다. 이때 크기와 색상을 추상화해야 합니다.

먼저 색상을 추상화한 코드를 작성합니다:

public abstract class Color {
    protected String color;

    public String getColor() {
        return color;
    }
}

세 가지 색상 클래스입니다: 빨간색, 파란색, 초록색

public class RedColor extends Color {
    public RedColor() {
        this.color = "빨간색";
    }
}

public class GreenColor extends Color {
    public GreenColor() {
        this.color = "초록색";
    }
}

public class BlueColor extends Color {
    public BlueColor() {
        this.color = "파란색";
    }
}

다음으로 붓을 추상화합니다:

public abstract class Pen {
    protected Color color;

    public abstract void draw();

    public void setColor(Color color) {
        this.color = color;
    }
}

세 가지 크기의 붓 클래스입니다: 대, 중, 소

public class BigPen extends Pen {
    @Override
    public void draw() {
        System.out.println("큰 " + color.getColor() + " 붓으로 그림 그리기");
    }
}

public class MiddlePen extends Pen {
    @Override
    public void draw() {
        System.out.println("중간 " + color.getColor() + " 붓으로 그림 그리기");
    }
}

public class SmallPen extends Pen {
    @Override
    public void draw() {
        System.out.println("작은 " + color.getColor() + " 붓으로 그림 그리기");
    }
}

클라이언트 테스트 클래스입니다:

public class BridgeTest {
    public static void main(String[] args) {
        executeDemo();
    }

    public static void executeDemo() {
        Pen pen = new BigPen();

        pen.setColor(new RedColor());
        pen.draw();

        pen.setColor(new GreenColor());
        pen.draw();

        pen.setColor(new BlueColor());
        pen.draw();

        pen = new SmallPen();
        pen.setColor(new BlueColor());
        pen.draw();
    }
}

실행 결과:

큰 빨간색 붓으로 그림 그리기
큰 초록색 붓으로 그림 그리기
큰 파란색 붓으로 그림 그리기
작은 파란색 붓으로 그림 그리기

위의 브릿지 패턴을 통해 확장성을 잘 구현할 수 있으며, 수정에는 닫혀 있고 확장에는 열려 있는 원칙을 준수합니다.

태그: Bridge Pattern Design Pattern java Object-Oriented Design Structural Pattern

6월 9일 01:52에 게시됨