안녕! 우리는 이제 광범위하고 매우 중요한 유용한 주제인 디자인 패턴을 계속해서 탐구합니다. 오늘은 브릿지 패턴에 대해 알아보겠습니다. 다른 패턴과 마찬가지로 브리지 패턴은 개발자가 소프트웨어 아키텍처를 설계할 때 직면하는 일반적인 문제를 해결하는 역할을 합니다. 오늘은 이 패턴의 특징을 알아보고 어떻게 활용하는지 알아보도록 하겠습니다.
여기에서 서로의 기능에 영향을 주지 않고 수정할 수 있는 두 개의 독립적인 구조를 볼 수 있습니다. 우리의 경우:
브리지 패턴이란 무엇입니까?
브리지 패턴은 구조적 디자인 패턴입니다. 즉, 주요 작업은 클래스와 객체로 완전한 구조를 만드는 것입니다. 브리지는 하나 이상의 클래스를 별도의 계층( 추상화 및 구현) 으로 나누어 이를 수행합니다 . 한 계층 구조의 기능 변경은 다른 계층의 변경을 수반하지 않습니다. 모두 훌륭하지만 이 정의는 매우 광범위하며 가장 중요한 질문인 "브리지 패턴이란 무엇입니까?"에 대한 답이 아닙니다. 실제 적용을 이해하는 것이 더 쉬울 것이라고 생각합니다. 이제 브리지 패턴에 대한 고전적인 시나리오를 만들어 보겠습니다.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