브리지(Bridge) 패턴

khbin·2023년 12월 4일
post-thumbnail

브리지(Bridge) 패턴

브리지 패턴(Bridge pattern)이란 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다.
; 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조(추상화 및 구현)로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴
<위키백과 -브리지패턴>


아래에 그림처럼 원, 직사각형이 있을 때 색깔을 갖는 원, 직사각형을 만들고 싶어 또 상속을 하려면 클래스의 수가 기하급수적으로 늘어난다. (삼각형이 추가된다거나, 색깔이 여러 개가 추가된다면)

그럴 때 상속에서 객체 합성으로 전환하여 문제를 해결하는 방법이 브리지 패턴이다.
차원 중 하나를(색) 별도의 클래스 계층 구조로 추출하여 원래 클래스들이 한 클래스 내에서 모든 상태와 행동들을 갖는 대신 새 계층구조의 객체를 참조한다.

public interface Color { string fill(); }

public class Red : Color
{
    public string fill()
    {
        return "Red";
    }
}
public class Blue : Color
{
    public string fill()
    {
        return "Blue";
    }
}

Color를 interface로 구현하고 그에 해당하는 함수(fill) 을 만들어 따로 객체로 전환하였다.

public abstract class Shape
{
    protected Color color;
    protected string name;
    protected Shape(Color color) { this.color = color; }
    public abstract void Draw();
}

public class Circle : Shape
{   
    public Circle(Color color) : base(color) { name = "원"; }
    public override void Draw()
    {
        Console.WriteLine($"{name} {color.fill()}");
    }
}
public class Rect : Shape
{
    public Rect(Color color) : base(color) { name = "직사각형"; }

    public override void Draw()
    {
        Console.WriteLine($"{name} {color.fill()}");
    }
}

추상 클래스 Shape에서는 Color를 멤버 변수로 받게 하여 클래스들의 합성으로 전환하였다.

static void Main(string[] args)
{
    Circle circle = new Circle(new Red());
    Rect rect = new Rect(new Blue());

    circle.Draw();
    rect.Draw();
}

이렇게 하게 되면 앞서 설명한 것처럼 자식 클래스들을 계속 상속하는 것이 아니라 멤버 변수로 클래스를 갖게 되기 때문에 구현하는데 분리가 된다.
따라서 색에 대한 추가 작업이 필요하다면 Color 부분을 수정하고
도형에 대한 작업이 필요하다면 Shape 부분을 수정해 클래스 간의 독립성을 더욱 높일 수 있다.

장점

  • 플랫폼 독립적인 클래스들과 앱들을 만들 수 있다.
  • 클라이언트 코드는 상위 수준의 추상화를 통해 작동하며, 플랫폼 세부 정보에 노출되지 않는다.
  • 개방/폐쇠 원칙. 새로운 추상화들과 구현들을 상호 독립적으로 도입할 수 있다.
  • 단일 책임 원칙. 추상화의 상위 수준 논리와 구현의 플랫폼 세부 정보에 집중할 수 있다.

단점

  • 결합도가 높은 클래스에 패턴을 적용하여 코드를 더 복잡하게 만들 수 있다.








[출처]
https://refactoring.guru/ko/design-patterns/bridge
https://hirlawldo.tistory.com/169

profile
틀린게 있다면 언제든지 알려주세요 감사합니다. 으라차차

0개의 댓글