다른 플랫폼에 이식하기 어렵습니다.
1) 활용성
추상적 개념과 이에 대한 구현 사이의 지속적인 종속 관계를 피하고 싶을 때
추상적 개념과 구현 모두가 독립적으로 서브클래싱을 통해 확장되어야 할 때
추상적 개념에 대한 구현 내용을 변경하는 것이 다른 관련 프로그램에 아무런 영향을 주지 않아야 할 때
클래스 계통에서 클래스 수가 급증하는 것을 방지하고자 할 때
여러 객체들에 걸쳐 구현을 공유하고자 하며, 이를 사용자에게 공개하고 싶지 않을 때
2) 구성요소
Abstraction : 추상적 개념에 대한 인터페이스를 제공하고 Implementor에 대한 참조자를 관리함
Refined Abstraction : Abstraction을 확장함
Implementor : 구현 클래스에 대한 인터페이스를 제공함
Concrete Implementor : Implementor를 구현하는 것
3) 결과
/
package com.ramesh.gof.bridge;
public abstract class MagicWeapon {
protected MagicWeaponImpl imp;
public MagicWeapon(MagicWeaponImpl imp) {
this.imp = imp;
}
public abstract void wield();
public abstract void swing();
public abstract void unwield();
public MagicWeaponImpl getImp() {
return imp;
}
}
public abstract class MagicWeaponImpl {
public abstract void wieldImp();
public abstract void swingImp();
public abstract void unwieldImp();
}
public class BlindingMagicWeapon extends MagicWeapon {
public BlindingMagicWeapon(BlindingMagicWeaponImpl imp) {
super(imp);
}
@Override
public BlindingMagicWeaponImpl getImp() {
return (BlindingMagicWeaponImpl) imp;
}
@Override
public void wield() {
getImp().wieldImp();
}
@Override
public void swing() {
getImp().swingImp();
}
@Override
public void unwield() {
getImp().unwieldImp();
}
public void blind() {
getImp().blindImp();
}
}
public abstract class BlindingMagicWeaponImpl extends MagicWeaponImpl {
public abstract void blindImp();
}
public class Excalibur extends BlindingMagicWeaponImpl {
@Override
public void wieldImp() {
System.out.println("wielding Excalibur");
}
@Override
public void swingImp() {
System.out.println("swinging Excalibur");
}
@Override
public void unwieldImp() {
System.out.println("unwielding Excalibur");
}
@Override
public void blindImp() {
System.out.println("bright light streams from Excalibur blinding the enemy");
}
}
public static void main(String[] args) {
BlindingMagicWeapon blindingMagicWeapon = new BlindingMagicWeapon(new Excalibur());
blindingMagicWeapon.wield();
blindingMagicWeapon.blind();
blindingMagicWeapon.swing();
blindingMagicWeapon.unwield();
}