본문 바로가기
Design Pattern

7. 브릿지 패턴 (Bridge pattern)

by 킹차니 2021. 12. 18.

 

브릿지 패턴

추상적인 것과 구체적인 것을 구분하는 패턴

-> 하나의 계층 구조일 때 보다 각기 나누었을 때 독립적인 계층 구조로 발전시킬 수 있다.

(abstraction은 상위의 추상적인 로직을 담고 있는 클래스이고, implementation은 특정 플랫폼에 맞추어진 구체적인 상태, 행동을 가지고 있는 부분이다.)

 

클라이언트는 추상적 계층을 사용하여 구체적 계층은 간접적으로 사용하게 된다.

 

 


코드로 살펴보기

Champion은 게임 캐릭터 클래스이다. Champion은 Skin을 장착할 수 있는데, 이러한 시나리오를 나타내면 아래와 같다.

 

먼저 Champion인터페이스이다. 모든 챔피언들은 아래의 인터페이스를 구현해야 한다.

Champion

 

챔피언인 KDA아리'KDA'는 Skin이고, '아리'는 챔피언 이름이다. 즉 KDA 스킨을 장착한 아리 챔피언이다.

 

만약 다른 챔피언을 또 추가한다면 위와 같이 Champion의 모든 메소드를 구현하면 된다.

 

이번에는 KDA를 장착한 카이사이다.

 

 

하지만 이와 같은 방법은 아주 반복적이라는 것이 보일 것이다..

하여 브릿지 패턴을 적용해보자.

 

DefaultChampion

위의 defaultChampion은 Champion을 implements하여 반복되는 모든 메소드들을 구현해두었다. 그리고 Skin을 필드에 저장하여 skin은 챔피언과 별개의 클래스로 분리하였다.

 

Champion구현체 아리

 

Champion구현체 카이사

챔피언은 skin을 받아 장착한다.

 

 

아래는 Skin인터페이스로 skin들은 아래의 인터페이스를 구현하면 된다.

 

새로운 Skin인 KDA와

 

PoolParty

 

 

지금까지  보면 알겠지만 DefaultChampion을 추가하고, Skin을 클래스로 분리함으로써 반복적인 코드가 사라지고 새로운 챔피언이나 스킨이 추가될 때 각 각의 계층(Champion과 Skin)을 따로 확장하는 것이 가능해지는 것이다.

 

이제 아래와 같이 테스트해보자

 

수행결과:

 

 


 

장점과 단점

장점 

1. 추상적인 코드를 구체적인 코드 변경 없이도 독립적으로 확장할 수 있다. (OCP - Open Close Principal)

2. 추상적인 코드와 구체적인 코드를 분리할 수 있다.

 

단점

계층 구조가 늘어나 복잡도가 증가할 수 있다.

 

 


 

 

실제로 어디서 사용되나?

 

1. JDBC

 

2. Logger

 

3. Spring

 

 

출처: 인프런 백기선님 '코딩으로 학습하는 GoF 강의'
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4