라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목디자인 패턴(Design Pattern) : 브릿지 패턴2022-06-14 22:34
작성자user icon Level 4

88x31.png


1. 브릿지 패턴(Bridge Pattern)


브릿지 패턴은 구현부에서 추상층을 분리하여 독립적인 변형을 가능하게 하는 패턴입니다... 

무슨말인지 이해가 잘 안됩니다. 이를 이해하기 위해 우선 상속에 대해 알아보도록 하겠습니다.


클래스는 상속(Inheritance)에 의하여 확장되고 상위 클래스와 하위 클래스로 구분되는데, 상속의 형태에 따라 클래스 계층의 형태도 달라집니다.


메소드 자체를 상속받아 분기되는 계층을 기능의 클래스 계층이라고 합니다. 예를 들어 진화생물학에 의하면 생물은 부모로부터 유전자를 상속받으며, 자연선택에 의해 상속받은 유전자를 변형시켜 나감으로써 유전자 다양성을 확장시켰습니다. 클래스 또한 부모 클래스로부터 메소드를 상속받아 이를 강화시켜 나감으로써 다형성을 확장시킬 수 있습니다.


wVZpzMgZHAfOAAAAABJRU5ErkJggg== 


양서류라는 클래스는 어류라는 클래스로부터 수중생활이라는 기능 즉, 메소드를 물려받았습니다. 여기에 더하여 양서류는 육지생활이라는 메소드를 추가함으로써 사지가 생기고 폐호흡을 하게 되어 양서류라는 클래스로 분기되었습니다. 즉, 육지생활이라는 메소드가 추가되어 사지라는 속성과 호흡이라는 속성에 변화가 생긴 것입니다. 예를 들면 양서류인 개구리는 올챙이때는 어류처럼 수중생활만 함으로써 사지가 없고 아가미 호흡을 하지만 성체가 되어 육지생활을 하면 사지가 생기고 폐호흡을 하게 됩니다.


이와 달리 메소드의 형태만 상속받아 분기되는 계층을 구현의 클래스 계층 이라고 합니다. 달리 말하자면 인터페이스(interface)의 상속이라고 할 수 있습니다.


D4ItTRdgO4X3AAAAAElFTkSuQmCC 


두꺼비, 도롱뇽 클래스는 방어수단 클래스를 상속받았습니다. 방어수단 클래스의 방어 메소드는 정의만 되어있고 어떻게 방어해야 할지를 구현해 놓지는 않습니다. 방어수단을 상속받은 클래스마다 방어방법이 다르기때문입니다. 구체적인 방어방법은 방어수단을 상속받은 두꺼비, 도롱뇽 클래스에서 각각 구현합니다. 방어 메소드에 따라 두꺼비는 독을 분비하고 도롱뇽은 꼬리를 끊어 방어를 합니다.


자바(Java)에서는 extends를 통해 부모 클래스를 상속받을 수 있으며, implements를 통해 부모 인터페이스를 상속받을 수 있습니다.


이제 브릿지 패턴이 어떤 패턴인지 다시 읽어보겠습니다.


 브릿지 패턴 : "구현부에서 추상층을 분리하여 독립적인 변형을 가능하게 하는 패턴"


위에 설명했듯이 상속의 형태에 따라 기능의 클래스 계층과 구현의 클래스 계층으로 나눠지는데 하나의 계층안에서 기능의 클래스 계층과 구현의 클래스 계층이 혼재할 수도 있습니다. 위에 예시에서는 구현계층에 양서류에 해당하는 종만 있지만 파충류, 포유류에 해당하는 종이 섞여있다면 클래스 계층이 복잡해져 어떤 클래스를 사용해야 할지 예측이 어려워집니다. 이런 이유로 두 계층을 독립된 클래스 계층으로 분리하게 되는데, 이때 두 계층을 연결하기 위해 브릿지 패턴을 사용합니다.


750px-Bridge_UML_class_diagram.svg.png


Abstraction은 '기능의 클래스 계층'의 최상위 클래스 입니다. Implementor의 기본적 기능에 대한 인터페이스입니다. 예제코드에서는 양서류에 해당하는 클래스가 될것입니다.


RefinedAbstraction은 Abstraction를 상속받은 하위 클래스 입니다. 예제코드에서는 두꺼비, 도롱뇽, 개구리가 양서류 클래스의 하위 클래스가 될것입니다.


Implementor은 '구현의 클래스 계층'의 최상위 클래스 입니다. 예제코드에서는 방어방법이 최상위 클래스가 됩니다.


ConcreteImplementor는 Implemntor를 상속받은 하위 클래스 입니다. 예제코드에서는 독분비, 꼬리끊기, 점액분비가 방어방법 클래스의 하위 클래스가 될것입니다.


예제코드를 작성해보겠습니다.


Amphibia.java:

P0WMsf5slj+tAAAAAElFTkSuQmCC 

기능 클래스 계층의 최상위 클래스 입니다. 합성(composition)을 통해 구현 클래스 계층과의 다리역할을 합니다.


Toad.java:

P5gbf6WuewxxAAAAAElFTkSuQmCC 

기능 클래스 계층의 하위 클래스 입니다. Amphibia를 상속받습니다.


Salamander.java:

333wDw0tq8AW+MEEIIcaeQHrAQQgjhA15PYe7p6RnIdgghhBB3FOkBCyGEED4gAVgIIYTwAQnAQgghhA9IABZCCCF84P8HHkI16eTwxVEAAAAASUVORK5CYII= 

마찬가지로 Amphibia를 상속받는 기능 클래스 계층의 하위 클래스 입니다.


Depense.java:

wHJCYFpg5qKUgAAAABJRU5ErkJggg== 

구현 클래스 계층의 최상위 인터페이스입니다.


Poison.java:

DWNdCBVe8hgnAAAAAElFTkSuQmCC 

구현 클래스 계층의 하위 클래스입니다. Depense 인터페이스를 상속받습니다.


TailCut.java:

9fyckLXjsyA7IAAAAAElFTkSuQmCC 

마찬가지로 Depense 인터페이스를 상속받는 구현 클래스 계층의 하위 클래스 입니다.


BridgePattern.java:

RAREVnxNFIVERFxyKKn7v75z392sh8iIiIrnkaqIiIiDlFQFRERcYiCqoiIiEMUVEVERByioCoiIuIQBVURERGHKKiKiIg4REFVRETEIQqqIiIiDlFQFRERcYiCqoiIiEP+PxQS6+Fx7jNpAAAAAElFTkSuQmCC 

FhI9gMnDPYeddqQljOigi8CSzLAltulOJVVU6RUNfZLtoz+3pubc3KGJYDcyvwBlzfxGDJdiZnliV3kpfh+ruz1MN4l4AlMZKDBVa4gNWEBKvQi3LO4FgWLJVzc6TyC+BNFNNN4X+INlUO6HawjQAAAABJRU5ErkJggg== 

#디자인 패턴# 브릿지 패턴
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)