[Design Pattern] 브릿지 패턴

Bridge Pattern

브릿지 패턴이란 구현에서 추상을 분리하여 이들이 독립적으로 다양성을 가질 수 있도록 하는 패턴이다.

활용성

  1. 추상적 개념과 이에 대한 구현 사이의 지속적인 종속 관계를 피하고 싶을 때. 예를들어 런타임에 구현 방법을 선택하거나 구현 내용을 변경하고 싶을 때
  2. 추상적 개념과 구현 모두가 독립적으로 서브 클래싱을 통해 확장되어야 할 때
  3. 추상적 개념에 대한 구현 내용을 변경하는 것이 다른 관련 프로그램에 아무런 영향을 주지 않아야 할 때

브릿지 패턴 사용에 따른 결과

인터페이스와 구현의 분리

구현이 인터페이스에 얽매이지 않게 된다. 추상적 개념에 대한 어떤 방식의 구현을 택할지가 런타임에 결정될 수 있다. 즉 런타임에 어떤 객체가 자신의 구현을 수시로 변경할 수 있고 이 말은 컴파일 타임 의존성을 제거할 수 있다.

확장성 제고

Abstraction과 Implementor를 독립적으로 확장이 가능하다.

구현 세부 사항을 사용자에게서 숨기기

상세한 구현 내용을 사용자에게서 은닉할 수 있다.

브릿지

구조

브릿지의 구조는 다음과 같다.

Bridge Pattern Diagram

C++ 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
void BridgePattern::getCircleWithApiA()
{
DrawAPI* drawApi = new AConcreteDrawAPI();
Shape* circle = new Circle(1.0, 1.0, 1.0, drawApi);
circle->draw();
}

void BridgePattern::getCircleWithApiB()
{
DrawAPI* drawApi = new BConcreteDrawAPI();
Shape* circle = new Circle(1.0, 1.0, 1.0, drawApi);
circle->draw();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Shape
{
public:
virtual ~Shape() {};
virtual void draw() = 0;
};

class Circle : public Shape
{
DrawAPI* drawApi;
double x;
double y;
double radius;
public:
Circle(double x, double y, double radius, DrawAPI* drawApi)
{
this->x = x;
this->y = y;
this->radius = radius;
this->drawApi = drawApi;
}

void draw()
{
drawApi->drawCircle(x, y, radius);
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class DrawAPI
{
public:
virtual ~DrawAPI() {};
virtual void drawCircle(double x, double y, double radius) = 0;
};

class AConcreteDrawAPI : public DrawAPI
{
public:
~AConcreteDrawAPI() override {}
void drawCircle(double x, double y, double radius) override
{
std::cout<<"Draw Circle with API A"<<std::endl;
std::cout<<"Draw Circle at "<<x<<":"<<y<<" "<<radius<<std::endl;
}
};

class BConcreteDrawAPI : public DrawAPI
{
public:
~BConcreteDrawAPI() override {}
void drawCircle(double x, double y, double radius) override
{
std::cout<<"Draw Circle with API B"<<std::endl;
std::cout<<"Draw Circle at "<<x<<":"<<y<<" "<<radius<<std::endl;
}
};

java 구현

1
2
3
4
5
6
7
8
9
public class Client {
public static void main(String[] args) {
Shape circleA = new Circle(1.0, 1.0, 1.0, new AConcreteDrawAPI());
Shape circleB = new Circle(1.0, 1.0, 1.0, new BConcreteDrawAPI());

circleA.draw();
circleB.draw();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public interface Shape {
void draw();
}

public class Circle implements Shape{
private DrawAPI drawAPI;
private double x;
private double y;
private double radius;


public Circle(double x, double y, double radius, DrawAPI drawAPI) {
this.x = x;
this.y = y;
this.radius = radius;
this.drawAPI = drawAPI;
}

@Override
public void draw() {
drawAPI.drawCircle(x, y, radius);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public interface DrawAPI {
void drawCircle(double x, double y, double radius);
}

public class AConcreteDrawAPI implements DrawAPI {
@Override
public void drawCircle(double x, double y, double radius) {
System.out.println("Draw Circle with API A");
System.out.println("Draw Circle at " + x + ":" + y + " " + radius);
}
}

public class BConcreteDrawAPI implements DrawAPI {
@Override
public void drawCircle(double x, double y, double radius) {
System.out.println("Draw Circle with API B");
System.out.println("Draw Circle at " + x + ":" + y + " " + radius);
}
}
Author: Song Hayoung
Link: https://songhayoung.github.io/2020/08/16/Design%20Pattern/BridgePattern/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.