브릿지 패턴 (Bridge Pattern)

sacyz1n2019.08.25 17:54조회 수 208추천 수 2댓글 5

  • 19
    • 글자 크기










ㅎㅇㅎㅇ

 

오늘은 브릿지 패턴을 살펴보겠습니다.

 

bridge 패턴

bridge는 '무엇인가를 연결한다'는 의미이다. bridge 패턴도 두 장소를 연결하는 역할을 한다. bridge 패턴은 기능의 클래스 계층과 구현의 클래스 계층을 연결하고, 구현부에서 추상 계층을 분리하여 각자 독립적으로 변형할 수 있게 해준다.

[그림 5-37]에서 supperClass의 method()는 implementor의 impMethod()를 사용해 구현되고, subClass의 subMethod()는 supperClass의 method()들을 사용해 구현된다. 그 결과 subClass와 implementor(concreteImplement)가 분리된다. bridge 패턴은 구현과 인터페이스(추상화된 부분)를 분리할 수 있고, 추상화된 부분과 실제 구현 부분을 독립적으로 확장할 수 있다.

-출처- 네이버 지식백과

 

뭐 이런 의미랍니다...ㅋ

 

bridge가 다리라는 뜻이 있죠? 

 

즉, 연결해준다는 의미가 되는데,

 

위에서 설명한것 처럼 기능 클래스 계층과 구현 클래스 계층을 연결하고

또, 그 구현클래스에서 추상 계층을 분리하여 각자 독립적으로 변형할 수 있게 해준다. 라고 나와있습니다.

 

근데 뭔 개소린지 모르겠습니다. 처음 보면 이게 뭔 개소리인가 하죠.

 

이제 이 내용을 게임을 예로들어 이해하도록 해보겠습니다.

 

어떤 중세시대 전략 시뮬레이션 게임이 있습니다.

 

이 게임엔 보병, 기병이 있습니다.

 

그런데 보병에도 칼을 쓰는 보병, 활을 쓰는 보병이 있고

 

기병에도 칼을 쓰는 기병, 활을 쓰는 기병이 있습니다. 

 

이 구조를 일반적인 상속구조로 구현하여 표현하면 아래와 같이 될겁니다.

 

제목 없음.png

 

칼, 활 클래스는 각각 모두 보병클래스나 기병 클래스를 상속하고 있습니다.

 

여기까진 좋습니다. 이렇게도 할 수 있지 라고 생각할겁니다.

 

그런데 어느날 게임이 패치가 되어 

 

무기중에 창이 추가가 되어서 창을 쓰는 보병과 창을 쓰는 기병을 개발해야합니다.

 

그래서 열심히 개발해서 위에서 했던 구조와 동일하게 추가하면 아래 그림과 같이 될겁니다.

제목 없음.png

 

 

여기까지도 뭐 이해가 된다고 할 수 있습니다. 

 

못할건 아니기 때문이죠.

 

그런데 지금은 간단한 설명을 위해서 유닛 종류가 보병, 기병 뿐이지만

 

실제 게임에선 엄청나게 많은 종류의 유닛이 있을겁니다.

 

새로운 무기가 추가되어서 그 무기를 사용할 수 있는 유닛을 상속하도록해야하는데 

 

일일이 다 상속시키실껍니까?

 

이걸 이해하셨다면 "확장성"에 문제가 있다는걸 알 수 있으실겁니다.

 

그래서 브릿지패턴이란게 나왔는데

 

맨 처음에 설명했다시피 기능 클래스와 구현 클래스를 분리한 뒤 연결하여 사용합니다.

 

위 예를든 게임에 적용 시켜보면 기능 클래스와 구현 클래스는 아래와 같이 됩니다.

 

1ㅇㅁㅇㄴ.png

 

여기서 기능클래스와 구현클래스를 연결 시킨다는건

 

기능 클래스의 최상위 부모 객체는 구현 클래스의 객체를 멤버 변수로 가지므로써, 이를 연결을 시킨다는 의미라고합니다.

 

이렇게 브릿지 패턴을 사용하면 새로운 무기가 추가될 경우 구현 클래스에만 추가하면 

 

창을 쓰는 보병이던지, 창을 쓰는 기병이던지 쉽게 추가할 수 있어 확장성이 좋습니다.

 

이걸 간단히 코드로 구현해봄으로써 글을 마치도록 하겠습니다.

 

<Main.cpp>

 

0.PNG

 

<CGameObject.h>

 

1.PNG

 

<CGameObject.cpp>

 

2.PNG

 

<CInfantry.h> (보병)

 

3.PNG

 

<CInfantry.cpp> (보병)

 

4.PNG

 

<CCalvalry.h> (기병)

 

5.PNG

 

<CCalvalry.cpp> (기병)

 

6.PNG

 

<CImplement.h>

 

a.PNG

 

<CImplement.cpp>

 

b.PNG

 

<CSword.h>

 

c.PNG

 

<CSword.cpp>

 

d.PNG

 

<CBow.h>

 

e.PNG

 

<CBow.cpp>

f.PNG

 

<CSpear.h>

 

g.PNG

 

 

<CSpear.cpp>

 

h.PNG

 

<출력 결과>

 

i.PNG

 

 

읽느라 고생하셨습니다 ㅂㅂ~

 

추천해주신 분들











  • 19
    • 글자 크기
메이플 모작 진행상황 (툴) (by sacyz1n) 디스코드 봇 만들기 [Create Discord Bot] - 1 (by 토끼린)

댓글 달기

댓글 5
첨부 (19)
제목 없음.png
11.3KB / Download 0
">
제목 없음.png
14.2KB / Download 0
">
1ㅇㅁㅇㄴ.png
15.5KB / Download 0
">
0.PNG
43.1KB / Download 0
">
1.PNG
39.5KB / Download 0
">
2.PNG
25.0KB / Download 0
">
3.PNG
22.9KB / Download 0
">
4.PNG
25.8KB / Download 0
">
5.PNG
21.8KB / Download 0
">
6.PNG
26.4KB / Download 0
">
a.PNG
25.5KB / Download 0
">
b.PNG
13.3KB / Download 0
">
c.PNG
24.6KB / Download 0
">
d.PNG
22.0KB / Download 0
">
e.PNG
24.1KB / Download 0
">
f.PNG
21.1KB / Download 0
">
g.PNG
23.8KB / Download 0
">
h.PNG
21.2KB / Download 0
">
i.PNG
11.5KB / Download 0
">

서버에 요청 중입니다. 잠시만 기다려 주십시오...