구현에서 추상을 분리하여, 이들이 독립적으로 다양성을 가질 수 있도록 하는 패턴
가교 패턴이란 말 그대로 다리를 놓는다고 생각하면 된다. 구현에서 추상을 분리하여 중간 다리를 놓는것이다.
예제코드를 살펴보자.
우리는 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();
}
}
PhoneEngine
과 IPhone, Gallxy
사이에 Phone
이라는 클래스를 두어 구현부 (PhoneEngine
, IPhone
, Gallxy
)와 추상부 (Phone
)를 분리하여 상호 독립적이고 확장가능하게 처리되었다.