브릿지 패턴 소개: 브릿지 패턴은 구조적 설계 패턴 중 하나로, 실제 세계에서 "다리"가 강 양쪽을 연결하는 주요 교통 수단인 것처럼, 이 패턴도 두 부분을 연결하는 역할을 합니다. 소프트웨어 설계에서도 유사하게 추상화와 구현을 분리하여 연결합니다.
브릿지 패턴 정의: 추상화 부분(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();
}
}
실행 결과:
큰 빨간색 붓으로 그림 그리기
큰 초록색 붓으로 그림 그리기
큰 파란색 붓으로 그림 그리기
작은 파란색 붓으로 그림 그리기
위의 브릿지 패턴을 통해 확장성을 잘 구현할 수 있으며, 수정에는 닫혀 있고 확장에는 열려 있는 원칙을 준수합니다.