Home 구조패턴 - 브릿지 패턴
Post
Cancel

구조패턴 - 브릿지 패턴

Bridge Pattern

디자인 패턴이란?

디자인 패턴이란?

  • 디자인 패턴은 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제를 자주 쓰이는 설계 방법을 정리한 패턴이다.
  • 디자인 패턴을 참고하여 개발하면 효율성과 유지보수성, 운용성이 높아지며, 프로그램 최적화가 된다고 한다.  

디자인 패턴을 목적과 범위로 나눌수 있다

구분유형설명
 생성객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행
목적구조더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴
 행위클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴
범위클래스클래스간 관련성(상속), 컴파일 시 정적으로 결정
 객체객체 간 관련성을 다루는 패턴, 런타임 시 동적으로 결정

 

기존의 시스템에 부수적인 새로운 기능을 추가할떄 사용하는 패턴
하나의 클래스, 메서드를 통해서 징검다리 역할

브릿지 패턴이란?

기능의 클래스 계층과 구현의 클래스 계층을 연결하고, 구현부에서 추상 계층을 분리하여 추상화된 부분과 실제 구현 부분을 독립적으로 확장할 수 있는 디자인 패턴 구현뿐만 아니라, 추상화된 부분까지 변경해야하는 경우 활용할 수 있다.

img

브릿지 패턴의 예 - Baeldung

  
세모와 네모는 다른 생김새지만 Shape이라는 특징이 같다. 그러므로 Shape으로 묶고 색상도 색은 다르지만 Color로 묶음으로써 사용자는 원하는 shape과 color를 사용할 수 있게 하는 구조이다.
색 관련 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 "파란색";
    }
}

그리는 툴 추상클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 = "[연필]";
 
    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();
    }
}

메인 테스트 코드

1
2
3
4
5
6
7
8
9
10
11
12
class BrushTest {
 
    @Test
    @DisplayName("브리지 패턴 테스트")
    void brushColorTest() {
        Brush redBrush = new HBPencil(new Red());
        Assertions.assertThat("[연필] 빨간색".equals(redBrush.draw()));
 
        Brush blueBrush = new MonoLine(new Blue());
        Assertions.assertThat("[붓] 파란색".equals(blueBrush.draw()));
    }
}

결론

  • 부모 추상클래스가 규칙을 정의할수 있고, 클래스에 규칙을 추가하고 싶을 경우
  • 객체에 대한 참조가 있는 추상클래스가 있고, 각각의 클래스에서 정의될 추상 메서드가 있는 경우

참고자료

Source Ⅰ
Head First 디자인패턴
면접을 위한 CS 전공지식노트 —

This post is licensed under CC BY 4.0 by the author.