定義
將事物實(shí)現(xiàn)從各維度抽象出來(lái),各維度獨(dú)立變化,之后通過(guò)聚合或依賴的方式組合起來(lái),減少各維度之間的相互耦合,從而更加適合變化。
適用于
當(dāng)一種事物在多個(gè)維度都有比較靈活的變化時(shí),如果為每個(gè)維度,每個(gè)變化都獨(dú)立一個(gè)類的話,假設(shè)有N個(gè)維度,每個(gè)維度有M個(gè)變化,那么就會(huì)創(chuàng)建MN個(gè)類,造成類爆炸。使用橋接模式,將各個(gè)維度之間解耦合,不使用繼承,使用依賴方式,解決類爆炸問題。
例子
說(shuō)明
一輛汽車有多個(gè)維度,這里暫時(shí)只考慮發(fā)動(dòng)機(jī)類型與座位類型,發(fā)動(dòng)機(jī)類型有單缸類型、多缸類型;座位類型有五座,七座。
代碼實(shí)現(xiàn)
車的抽象類
public abstract class AbstractCar {
protected AbstractEngine engine;
protected AbstractSit sit;
public AbstractCar(AbstractEngine engine, AbstractSit sit) {
this.engine = engine;
this.sit = sit;
}
/**
* 啟動(dòng)
*/
public abstract void run();
/**
* 入座
*/
public abstract void sit();
}
車的實(shí)現(xiàn)類
public class BMWCar extends AbstractCar {
public BMWCar(AbstractEngine engine, AbstractSit sit) {
super(engine, sit);
}
@Override
public void run() {
System.out.println("寶馬車開始啟動(dòng)了。。。");
sit();
engine.start();
}
@Override
public void sit() {
System.out.println("落座寶馬車了。。。");
sit.sit();
}
}
發(fā)動(dòng)機(jī)的抽象類
public abstract class AbstractEngine {
/**
* 啟動(dòng)
*/
public abstract void start();
}
發(fā)動(dòng)機(jī)的單缸和多缸實(shí)現(xiàn)類
public class SingleJarEngine extends AbstractEngine {
@Override
public void start() {
System.out.println("單缸引擎啟動(dòng)了。。。");
}
}
public class MultiJarEngine extends AbstractEngine {
@Override
public void start() {
System.out.println("多缸引擎啟動(dòng)了。。。");
}
}
座位的抽象類
public abstract class AbstractSit {
/**
* 座位
*/
public abstract void sit();
}
座位的實(shí)現(xiàn)類
public class FiveSit extends AbstractSit {
@Override
public void sit() {
System.out.println("您乘坐的是五座的車。。。");
}
}
public class SevenSit extends AbstractSit {
@Override
public void sit() {
System.out.println("您乘坐的是七座的車。。。");
}
}
測(cè)試demo
public class BridgeDesignTest {
public static void main(String[] args) {
//五座,單缸 寶馬車
BMWCar fiveSitAndSingleJarEngineCar = new BMWCar(new SingleJarEngine(), new FiveSit());
fiveSitAndSingleJarEngineCar.run();
//五座,多缸 寶馬車
BMWCar fiveSitAndMultiJarEngineCar = new BMWCar(new MultiJarEngine(), new FiveSit());
fiveSitAndMultiJarEngineCar.run();
//七座,單缸 寶馬車
BMWCar sevenSitAndSingleJarEngineCar = new BMWCar(new SingleJarEngine(), new SevenSit());
sevenSitAndSingleJarEngineCar.run();
//七座,多缸 寶馬車
BMWCar sevenSitAndMultiJarEngineCar = new BMWCar(new MultiJarEngine(), new SevenSit());
sevenSitAndMultiJarEngineCar.run();
}
}