Computer Science/디자인 패턴

브릿지 패턴 (가교 패턴)

eunnnn 2023. 4. 24. 12:21

브릿지패턴이란 

브릿지 패턴 큰 클래스 또는 밀접하게 관련된 클래스들의 집합을 두 개의 개별 계층구조​(추상화 및 구현)​로 나눈 후 각각 독립적으로 개발할 수 있도록 하는 구조 디자인 패턴입니다.

 

말로는 잘 와닿지 않는 개념이니, 그림과 함께 살펴보자

Circle​(원) 및 Square​(직사각형)​라는 한 쌍의 자식 클래스들이 있는 기하학적 Shape​(모양) 클래스가 있다고 가정하고, 이 클래스 계층 구조를 확장하여 색상을 도입하기 위해 Red​(빨간색) 및 Blue​(파란색) 모양들의 자식 클래스들을 만든다고 하자. 그러나 Shape에는 이미 두 개의 자식 클래스가 있으므로 Blue­Circle​(파란색 원) 및 Red­Square​(빨간색 직사각형)​와 같은 네 가지의 클래스 조합을 만들어야 한다.

 

그래서 브릿지 패턴은 상속에서 객체 합성으로 전환하여 이 문제를 해결하려고 한다. 이것이 의미하는 바는 차원 중 하나를 별도의 클래스 계층구조로 추출하여 원래 클래스들이 한 클래스 내에서 모든 상태와 행동들을 갖는 대신 새 계층구조의 객체를 참조하도록 한다는 것입니다.

클래스 계층구조의 기하급수적인 성장을 방지하기 위하여 그것을 여러 관련 계층구조들로 변환할 수 있습니다.

이 접근 방식을 따르면, 색상 관련 코드를 Red  Blue라는 두 개의 자식 클래스들이 있는 자체 클래스로 추출할 수 있습니다. 그런 다음 Shape 클래스는 색상 객체들 중 하나를 가리키는 참조 필드를 받습니다. 이제 모양은 연결된 색상 객체에 모든 색상 관련 작업을 위임할 수 있다. 이 참조는 Shape  Color 클래스들 사이의 브리지​(다리) 역할을 할 것이다. 이제부터 새 색상들을 추가할 때 모양 계층구조를 변경할 필요가 없으며 그 반대의 경우도 마찬가지다.

 

public interface Color {
    String fill();
}

public class Red implements Color {
    @Override
    public String fill() {
        return "발간색";
    }
}
public class Blue implements Color {
    @Override
    public String fill() {
        return "파란색";
    }
}
public abstract class Brush {
    protected Color color;
 
    protected Brush(Color color) {
        this.color = color;
    }
 
    public abstract String draw();
 
}
public class HBPencil extends Brush {
    public static final String type = "[HB 연필]";
 
    public HBPencil(Color color) {
        super(color);
    }
 
    @Override
    public String draw() {
        return type + " " + color.fill();
    }
}

public class MonoLine extends Brush {
    public static final String type = "[모노라인]";
 
    public MonoLine(Color color) {
        super(color);
    }
 
    @Override
    public String draw() {
        return type + " " + color.fill();
    }
}


브릿지패턴의 장단점

장점

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

단점

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