CodeGym /Java Blog /무작위의 /교량 디자인 패턴
John Squirrels
레벨 41
San Francisco

교량 디자인 패턴

무작위의 그룹에 게시되었습니다
안녕! 우리는 이제 광범위하고 매우 중요한 유용한 주제인 디자인 패턴을 계속해서 탐구합니다. 오늘은 브릿지 패턴에 대해 알아보겠습니다. 다른 패턴과 마찬가지로 브리지 패턴은 개발자가 소프트웨어 아키텍처를 설계할 때 직면하는 일반적인 문제를 해결하는 역할을 합니다. 오늘은 이 패턴의 특징을 알아보고 어떻게 활용하는지 알아보도록 하겠습니다.

브리지 패턴이란 무엇입니까?

브리지 패턴은 구조적 디자인 패턴입니다. 즉, 주요 작업은 클래스와 객체로 완전한 구조를 만드는 것입니다. 브리지는 하나 이상의 클래스를 별도의 계층( 추상화구현) 으로 나누어 이를 수행합니다 . 한 계층 구조의 기능 변경은 다른 계층의 변경을 수반하지 않습니다. 모두 훌륭하지만 이 정의는 매우 광범위하며 가장 중요한 질문인 "브리지 패턴이란 무엇입니까?"에 대한 답이 아닙니다. 실제 적용을 이해하는 것이 더 쉬울 것이라고 생각합니다. 이제 브리지 패턴에 대한 고전적인 시나리오를 만들어 보겠습니다. 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, GreenColorRedColor:
  • 색상.자바:

    
    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는 두 개의 개별 클래스 계층을 연결하는 다리입니다.

브리지 구축 방법: 추상화 및 구현

브리지 패턴을 나타내는 클래스 다이어그램을 살펴보겠습니다. 브리지 디자인 패턴 소개 - 2여기에서 서로의 기능에 영향을 주지 않고 수정할 수 있는 두 개의 독립적인 구조를 볼 수 있습니다. 우리의 경우:
  • 추상화는 Shape클래스 다
  • Triangle세련된 추상화는 및 Rectangle클래스 입니다.
  • 구현자는 Color인터페이스 입니다.
  • ConcreteImplementor는 BlackColor, GreenColorRedColor클래스입니다.
클래스 는 인터페이스(구현자) Shape에 위임하는 다양한 색상으로 도형 채우기를 관리하는 메커니즘인 추상화입니다 Color. Triangle및 클래스 는 클래스 Rectangle에서 사용할 수 있는 메커니즘을 사용하는 구체적인 클래스입니다 Shape. BlackColor, GreenColorRedColor구현 계층 구조의 구체적인 구현입니다.

브리지 패턴을 사용하는 위치

이 패턴을 사용하는 큰 이점은 다른 계층의 논리를 손상시키지 않고 한 계층 구조에서 기능 클래스를 변경할 수 있다는 것입니다. 또한 이 접근 방식은 클래스 간의 결합을 줄이는 데 도움이 됩니다. 이 패턴을 사용할 때의 주요 요구 사항은 "지침을 따르십시오"입니다. 지침을 무시하지 마십시오! 이를 위해 브리지 패턴을 반드시 사용해야 하는 상황을 파악해 보겠습니다.
  1. 두 가지 개념(예: 모양 및 색상)의 조합을 기반으로 엔터티 수를 확장해야 하는 경우.

  2. 단일 책임 원칙을 충족하지 않는 큰 클래스를 기능이 좁은 작은 클래스로 나누려는 경우.

  3. 프로그램이 실행되는 동안 특정 엔터티의 논리를 변경해야 하는 경우.

  4. 클래스 또는 라이브러리의 클라이언트로부터 구현을 숨길 필요가 있는 경우.

이 패턴을 사용할 때 항상 코드에 추가 엔터티를 추가한다는 점을 기억하세요. 하나의 모양과 하나 또는 두 개의 가능한 색상만 있는 프로젝트에서 사용하는 것은 이치에 맞지 않을 수 있습니다.

패턴의 장단점

다른 패턴과 마찬가지로 브리지에는 장점과 단점이 모두 있습니다. 브리지 패턴의 장점:
  1. 코드의 확장성을 향상시켜 프로그램의 다른 부분에서 무언가 손상될 염려 없이 기능을 추가할 수 있습니다.
  2. 엔터티 수가 두 가지 개념(예: 모양 및 색상)의 조합을 기반으로 하는 경우 하위 클래스 수를 줄입니다.
  3. 추상화와 구현이라는 두 개의 별도 계층에서 개별적으로 작업할 수 있습니다. 서로 다른 두 개발자가 서로의 코드를 자세히 살펴보지 않고도 변경 작업을 수행할 수 있습니다.
  4. 이는 클래스 간의 결합을 줄입니다. 두 클래스가 결합되는 유일한 장소는 브리지(예: 필드 Color color)입니다.
브리지 패턴의 단점:
  1. 특정 상황과 프로젝트의 전체 구조에 따라 프로그램 성능에 부정적인 영향을 미칠 수 있습니다(예: 더 많은 개체를 초기화해야 하는 경우).
  2. 두 클래스 사이를 전환해야 하므로 코드 가독성이 떨어집니다.

전략 패턴과의 차이점

브리지 패턴은 종종 다른 디자인 패턴인 전략과 혼동됩니다. 둘 다 컴포지션을 사용합니다(그림과 색상이 포함된 예제에서는 집계를 사용했지만 브리지 패턴도 컴포지션을 사용할 수 있음). 다른 개체에 작업을 위임합니다. 그러나 그들 사이에는 차이가 있으며 그것은 엄청납니다. 전략 패턴은 행동 패턴입니다. 완전히 다른 문제를 해결합니다. 전략은 알고리즘을 상호 교환할 수 있는 반면 브리지는 다른 구현 중에서 선택하기 위해 구현에서 추상화를 분리합니다. 즉, 전략과 달리 브리지는 전체 엔터티 또는 계층 구조에 적용됩니다. 브리지 패턴은 개발자의 무기고에서 좋은 무기가 될 수 있습니다. 가장 중요한 것은 그것을 사용할 가치가 있는 상황을 식별하고 다른 패턴이 적절한 때를 인식하는 것입니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION