最近的一次面試中,被問到橋接模式,以前呢並沒有很仔細的研究過這個設計模式,藉此機會剖析一下。 先給出自己對這個模式理解後的源碼: 那麼設個設計模式的應用場景呢? 從參考資料1中的解釋是,數據機Modem,舊版OldModem採用的的dial和answer的模式,新版採用send和receive的 ...
最近的一次面試中,被問到橋接模式,以前呢並沒有很仔細的研究過這個設計模式,藉此機會剖析一下。
先給出自己對這個模式理解後的源碼:
interface A{ void methodA(); } interface B{ void methodB(); } Class AImpl implements A{ Interface B; void methodA{ B.methodB(); } }
那麼設個設計模式的應用場景呢?
從參考資料1中的解釋是,數據機Modem,舊版OldModem採用的的dial和answer的模式,新版採用send和receive的模式。
整個模式的構建如下:
interface OldModem{ void dial(); void answer(); } interface NewModem{ void send(); void receive(); } //相容OldModem的新Modem的實現 Class CapitableOldModemImpl implements OldModem{ NewModem newModem; CapitableOldModemImpl(NewModem param){ newModem = param; } void dial{ newModem.send(); } void answer{ newModem.receive(); } }
從這個可以看出來,OldModem自成一個體系,NewModem也是自成一個體系,那麼以前的老產品繼續繼承自 OldModem就可以了,新的NewModem不想相容OldModem那就直接集成NewModem就行了。
但是當新的Modem需要相容老的OldModem的時候,這個時候就需要CapitableOldModemImpl這種形式了,講兩種抽象組合在一起。
那麼有人就會說了,你這麼設計的手段不就是組合兩個介面嗎,那麼跟Adapter有什麼區別?
從我自己的理解:Adapter模式是為瞭解決介面適配問題,更多的是對實現做變換。Bridge是為了將兩種不同的抽象分離,達到獨立變化的目的。 從我們的這個例子中我們可以看出來,就是為瞭解決新老介面的是適配問題。但是Aadpter是1:1的適配,這裡的適配是兩個大類型的適配,可以做到m:n適配。
參考文獻:
【1】馬丁
敏捷軟體開發(原則模式與實踐).P283(Bridge模式).