포스트

[Structural Pattern] 브릿지 패턴 (Bridge Pattern)

Design Pattern / Structural Pattern

브릿지 패턴의 정의와 해당 디자인 패턴의 예제 코드를 통한 이해 및 설명 정리

개념

간단하게 실제 다리를 생각하면 됨 (기능 클래스 계층 <===== Bridge =====> 구현 클래스 계층)

강에 다리를 놓음으로써 강 양쪽의 두 장소를 연결하는 것과 같이 기능 클래스 계층과 구현 클래스 계층을 잇는 다리의 역할을 하는 패턴

adapter_example

  • feat. Tower Bridge (London)
  • 객체의 구현부와 추상적인 부분을 분리하여 각각을 독립적으로 변형할 수 있게 하는 디자인 패턴 중 하나

  • 브릿지 패턴을 사용하면 추상화와 구현을 분리하여 클래스 간의 결합도를 낮출 수 있으며, 이는 코드의 재사용성과 유연성을 높일 수 있게 해줌

  • 개발에서 주로 사용 가능한 경우

    • 데이터베이스 연동

    • 네트워크 통신

    • 플러그인 시스템

    • UI 개발

    • 하드웨어 연동

패턴 구조

composite_example

  • Abstraction

    • 기능 계층의 최상위 클래스

      • 추상화된 인터페이스를 제공하며, 이 인터페이스는 구현에 의존하지 않음
  • RefindeAbstraction

    • 기능 계층에서 새로운 부분을 확장한 클래스

      • 추상화된 인터페이스를 확장
  • Implementor

    • Abstraction의 기능을 구현하기 위한 인터페이스의 정의

      • 구현 인터페이스를 정의
  • ConcreteImplementor

    • 실제 기능을 구현

      • 구현 인터페이스를 실제로 구현

예제 코드

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
/*
<예제 요구사항>

- 멀티 플랫폼을 지원하는GUI 도구를 만들 예정

- Mac 운영체제와 Windows 운영체제의 버튼을 만듦

- 버튼의 요구사항은 아래와 같음
  - 버튼에는 색상이 들어갈 수 있음
  - 버튼을 클릭하면 실행될 이벤트를 줄 수 있음
*/

/**
 * Abstraction
 */
interface IButton {
  onClick(): void;
}

/**
 * Implementation
 */
interface IColor {
  getColorCode(): string;
}

export { IButton, IColor };
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Concrete Implementation

import { IColor } from "./bridge_config";

class Red implements IColor {
  getColorCode(): string {
    return "#FF0000 (Red)";
  }
}

class Blue implements IColor {
  getColorCode(): string {
    return "#0000FF (Blue)";
  }
}

export { Blue, Red };
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
// Refined Abstraction

import { IButton, IColor } from "./bridge_config";

class MacButton implements IButton {
  private color: IColor;

  constructor(color: IColor) {
    this.color = color;
  }

  onClick(): void {
    console.log(
      "Click Mac Button\n색상 컬러: " + this.color.getColorCode() + "\n"
    );
  }
}

class WindowsButton implements IButton {
  private color: IColor;

  constructor(color: IColor) {
    this.color = color;
  }

  onClick(): void {
    console.log(
      "Click Windows Button\n색상 컬러: " + this.color.getColorCode() + "\n"
    );
  }
}

export { MacButton, WindowsButton };
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import { MacButton, WindowsButton } from "./bridge_concrete_implementation";
import { Blue, Red } from "./bridge_refined_abstraction";

class Client {
  public static main(_args?: string[]): void {
    const macButton = new MacButton(new Red());
    const windowsButton = new WindowsButton(new Blue());

    macButton.onClick();
    windowsButton.onClick();
  }
}

Client.main();

// Click Mac Button
// 색상 컬러: #FF0000 (Red)

// Click Windows Button
// 색상 컬러: #0000FF (Blue)

참고한 출처 사이트

Refactoring GURU

Inpa Dev Blog (디자인 패턴)

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.