안녕! 우리는 이제 광범위하고 매우 중요한 유용한 주제인 디자인 패턴을 계속해서 탐구합니다. 오늘은 브릿지 패턴에 대해 알아보겠습니다. 다른 패턴과 마찬가지로 브리지 패턴은 개발자가 소프트웨어 아키텍처를 설계할 때 직면하는 일반적인 문제를 해결하는 역할을 합니다. 오늘은 이 패턴의 특징을 알아보고 어떻게 활용하는지 알아보도록 하겠습니다.
브리지 패턴이란 무엇입니까?
브리지 패턴은 구조적 디자인 패턴입니다. 즉, 주요 작업은 클래스와 객체로 완전한 구조를 만드는 것입니다. 브리지는 하나 이상의 클래스를 별도의 계층( 추상화 및 구현) 으로 나누어 이를 수행합니다 . 한 계층 구조의 기능 변경은 다른 계층의 변경을 수반하지 않습니다. 모두 훌륭하지만 이 정의는 매우 광범위하며 가장 중요한 질문인 "브리지 패턴이란 무엇입니까?"에 대한 답이 아닙니다. 실제 적용을 이해하는 것이 더 쉬울 것이라고 생각합니다. 이제 브리지 패턴에 대한 고전적인 시나리오를 만들어 보겠습니다.Shape
일반적인 기하학적 도형을 나타내는 추상 클래스가 있습니다 .
-
모양.자바
public abstract class Shape { public abstract void draw(); }
삼각형 및 직사각형과 같은 모양을 추가하기로 결정하면 클래스를 상속하도록 합니다
Shape
. -
직사각형.자바:
public class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing rectangle"); } }
-
삼각형.자바:
public class Triangle extends Shape { @Override public void draw() { System.out.println("Drawing triangle"); } }
draw()
이 색상에 따라 달라집니다. 메서드를 다르게 구현하려면 draw()
각 모양-색상 조합에 대한 클래스를 만들어야 합니다. 세 가지 색상이 있는 경우 TriangleBlack
, TriangleGreen
, TriangleRed
, RectangleBlack
및 의 6개 클래스 RectangleGreen
가 필요합니다 RectangleRed
. 6개의 클래스는 그렇게 큰 문제가 아닙니다. 하지만! 새로운 모양이나 색상을 추가해야 하는 경우 클래스 수가 기하급수적으로 늘어납니다. 이 상황에서 벗어나는 방법? 필드에 색상을 저장하고 조건문을 사용하여 모든 옵션을 열거하는 것은 최상의 솔루션이 아닙니다. 좋은 해결책은 색상을 별도의 인터페이스로 옮기는 것입니다.. Color
세 가지 구현이 있는 인터페이스를 만들어 보겠습니다. BlackColor
, GreenColor
및 RedColor
:
-
색상.자바:
public interface Color { void fillColor(); }
-
BlackColor.java:
public class BlackColor implements Color { @Override public void fillColor() { System.out.println("Filling in black color"); } }
-
GreenColor.java
public class GreenColor implements Color { @Override public void fillColor() { System.out.println("Filling in green color"); } }
-
RedColor.java
public class RedColor implements Color { @Override public void fillColor() { System.out.println("Filling in red color"); } }
Color
이제 클래스 에 필드를 추가합니다Shape
. 우리는 생성자에서 그 값을 얻을 것입니다. -
모양.자바:
public abstract class Shape { protected Color color; public Shape(Color color) { this.color = color; } public abstract void draw(); }
color
우리는 구현 에서 변수를 사용할 것입니다Shape
. 이것은 도형이 이제 인터페이스의 기능을 사용할 수 있음을 의미합니다Color
. -
Rectangle.java
public class Rectangle extends Shape { public Rectangle(Color color) { super(color); } @Override public void draw() { System.out.println("Drawing rectangle"); color.fillColor(); } }
Color color
는 두 개의 개별 클래스 계층을 연결하는 다리입니다.
브리지 구축 방법: 추상화 및 구현
브리지 패턴을 나타내는 클래스 다이어그램을 살펴보겠습니다. 여기에서 서로의 기능에 영향을 주지 않고 수정할 수 있는 두 개의 독립적인 구조를 볼 수 있습니다. 우리의 경우:- 추상화는
Shape
클래스 다 Triangle
세련된 추상화는 및Rectangle
클래스 입니다.- 구현자는
Color
인터페이스 입니다. - ConcreteImplementor는
BlackColor
,GreenColor
및RedColor
클래스입니다.
Shape
에 위임하는 다양한 색상으로 도형 채우기를 관리하는 메커니즘인 추상화입니다 Color
. Triangle
및 클래스 는 클래스 Rectangle
에서 사용할 수 있는 메커니즘을 사용하는 구체적인 클래스입니다 Shape
. BlackColor
, GreenColor
및 RedColor
구현 계층 구조의 구체적인 구현입니다.
브리지 패턴을 사용하는 위치
이 패턴을 사용하는 큰 이점은 다른 계층의 논리를 손상시키지 않고 한 계층 구조에서 기능 클래스를 변경할 수 있다는 것입니다. 또한 이 접근 방식은 클래스 간의 결합을 줄이는 데 도움이 됩니다. 이 패턴을 사용할 때의 주요 요구 사항은 "지침을 따르십시오"입니다. 지침을 무시하지 마십시오! 이를 위해 브리지 패턴을 반드시 사용해야 하는 상황을 파악해 보겠습니다.-
두 가지 개념(예: 모양 및 색상)의 조합을 기반으로 엔터티 수를 확장해야 하는 경우.
-
단일 책임 원칙을 충족하지 않는 큰 클래스를 기능이 좁은 작은 클래스로 나누려는 경우.
-
프로그램이 실행되는 동안 특정 엔터티의 논리를 변경해야 하는 경우.
-
클래스 또는 라이브러리의 클라이언트로부터 구현을 숨길 필요가 있는 경우.
패턴의 장단점
다른 패턴과 마찬가지로 브리지에는 장점과 단점이 모두 있습니다. 브리지 패턴의 장점:- 코드의 확장성을 향상시켜 프로그램의 다른 부분에서 무언가 손상될 염려 없이 기능을 추가할 수 있습니다.
- 엔터티 수가 두 가지 개념(예: 모양 및 색상)의 조합을 기반으로 하는 경우 하위 클래스 수를 줄입니다.
- 추상화와 구현이라는 두 개의 별도 계층에서 개별적으로 작업할 수 있습니다. 서로 다른 두 개발자가 서로의 코드를 자세히 살펴보지 않고도 변경 작업을 수행할 수 있습니다.
- 이는 클래스 간의 결합을 줄입니다. 두 클래스가 결합되는 유일한 장소는 브리지(예: 필드
Color color
)입니다.
- 특정 상황과 프로젝트의 전체 구조에 따라 프로그램 성능에 부정적인 영향을 미칠 수 있습니다(예: 더 많은 개체를 초기화해야 하는 경우).
- 두 클래스 사이를 전환해야 하므로 코드 가독성이 떨어집니다.
GO TO FULL VERSION