가교 패턴(Bridge Pattern)
디자인패턴 공부하기
  • JavaScript

가교 패턴(Bridge Pattern)

구현에서 추상을 분리하여, 이들이 독립적으로 다양성을 가질 수 있도록 하는 패턴

코드로 살펴보자

가교 패턴이란 말 그대로 다리를 놓는다고 생각하면 된다. 구현에서 추상을 분리하여 중간 다리를 놓는것이다.

예제코드를 살펴보자.

우리는 iPhone이라는 휴대폰을 사용한다고 해보자.

class IPhone {
  call() {};
  stop() {};
}

class Person extends IPhone {
  run() {
    this.call();
    this.stop();
  }
}

통화를 시작하고 통화가 종료되는 간단한 코드이다.

어느날 사용자들은 iPhone이 아닌 Gallxy 를 사용하고싶어졌다!! 그래서 IPhone이 아닌 Phone이라는 interface를 생성하고 그것을 상속하도록 수정해보았다.

class PhoneEngine {
  call() {};
  stop() {};
}

class IPhone extends PhoneEngine {
  run() {
    this.call();
    this.stop();
  }
}

class Gallxy extends PhoneEngine {
  run() {
    this.call();
    this.stop();
  }
}

어렵지 않게 구현한 듯 하다. (예제의 코드가 짧기 때문일지도!)

어느날 사용자는 또다른 요구사항이 생겼다. 그것은 iPhone에서만 통화하고 1분이 지난 뒤 통화가 끝났으면 좋겠다고 한다.

현재 코드로는 문제가 생겼다!

이러한 경우에 브릿지 즉 다리를 놓는다. 사용자에게 PhoneEngine을 직접 상속받게 하지 말고, 중간 다리를 하나 놓는다.

class PhoneEngine {
  call() {};
  stop() {};
}

class Phone extends PhoneEngine {
  playCall() {
    this.call();
    this.stop();
  }

  playOneMinuteCall() {
    this.call();
    sleep(1000); // 편의를 위해 함수 구현은 하지 않는다.
    this.stop();
  }
}

class IPhone extends Phone {
  run() {
    playOneMinuteCall();
  }
}

class Gallxy extends Phone {
  run() {
    playCall();
  }
}

PhoneEngineIPhone, Gallxy사이에 Phone이라는 클래스를 두어 구현부 (PhoneEngine, IPhone, Gallxy)와 추상부 (Phone)를 분리하여 상호 독립적이고 확장가능하게 처리되었다.

장점은?

  • 인터페이스와 구현을 분리할 수 있다.
  • 구현부의 수정이 다른 클래스에 영향을 주지 않는다.
  • 코드 구조가 더욱 계층적으로 바뀌었다.
  • 구현부의 세부사항을 숨길 수 있다.