학습 목표
- 추상화(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 객체에서 해당 객체를 그리는 실제 구현체를 변경하는 방법
마무리
실제 코드에서 이용하는 방법으로는 채팅과 같은 네이버톡톡, 카카오톡, 슬랙 같은 발송 객체가 달라지는 것 같이 쓰면 좋을 것 같다. 어뎁터 패턴으로 앞에 바꾸는 방식으로도 충분히 구현은 가능하겠지만 알아두어서 나쁘지 않은 패턴 같습니다.
'Java > 패턴' 카테고리의 다른 글
| 데코레이터 패턴 ( Decorator Pattern ) (0) | 2025.11.26 |
|---|---|
| 컴포지트 패턴 ( Composite Pattern ) (0) | 2025.11.25 |
| 추상 팩토리 패턴 ( Abstract Factory Pattern ) (0) | 2025.11.23 |
| 빌더 패턴 ( Builder Pattern ) (0) | 2025.11.22 |
| 프로토 타입 패턴( Prototype Pattern ) (0) | 2025.11.21 |