概念
橋接模式:亦稱Bridge模式,構(gòu)造型設(shè)計(jì)模式之一遇革。
??將抽象部分(abstraction)和它的實(shí)現(xiàn)部分(implementor)分離潦匈,使這兩部分能夠獨(dú)立的變化與擴(kuò)展谚咬。
??將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系烘嘱,降低了類與類之間的耦合昆禽,降低代碼量蝗蛙。
UML
角色
- 抽象部分(Abstraction):該類保存一個(gè)對(duì)實(shí)現(xiàn)部分對(duì)象的引用。抽象部分的方法需要調(diào)用實(shí)現(xiàn)部分的對(duì)象來實(shí)現(xiàn)为狸,一般為abstract類歼郭。
- 優(yōu)化的抽象部分(RefinedAbstraction):抽象部分的具體實(shí)現(xiàn),修正或完善抽象部分的方法
- 實(shí)現(xiàn)部分 (Implementor):可以為抽象類或接口辐棒,實(shí)現(xiàn)部分的方法不一定要與抽象部分方法一致。它提供的是底層的方法牍蜂,供抽象部分定義的上層的業(yè)務(wù)方法進(jìn)行調(diào)用漾根。
- 具體實(shí)現(xiàn)的實(shí)現(xiàn)部分(ConcreteImplementorA/ConcreteImplementorB):實(shí)現(xiàn)部分的具體實(shí)現(xiàn),可認(rèn)為是實(shí)現(xiàn)部分中方法的具體實(shí)現(xiàn)
- 客戶類(Client):橋接模式的具體使用者鲫竞。
簡(jiǎn)單示例
最近手機(jī)摔了辐怕,破相了。無奈再換個(gè)新的吧从绘,目前對(duì)性能沒有太大的要求寄疏,就是需要能存儲(chǔ)東西即可,性價(jià)比高當(dāng)然更好了僵井。選什么品牌呢陕截?選多大的存儲(chǔ)呢?這是個(gè)問題批什。這不就是可以用橋接模式么农曲。
Implementor類:
實(shí)現(xiàn)部分(存儲(chǔ)ROM)的抽象接口
package com.bamboolmc.designpattern.BridgeMode;
public interface ROM {
/**
* 配置ROM大小
*/
public void ConfigRom ();
}
ConcreteImplementor類:
實(shí)現(xiàn)部分(存儲(chǔ)ROM)的具體實(shí)現(xiàn)(32G/64G)
package com.bamboolmc.designpattern.BridgeMode;
public class ROM_32 implements ROM {
@Override
public void ConfigRom() {
System.out.println("ROM配置了32G,只能存一些照片驻债、電影");
}
}
package com.bamboolmc.designpattern.BridgeMode;
public class ROM_64 implements ROM{
@Override
public void ConfigRom() {
System.out.println("ROM配置了64G乳规,能存放很多照片、電影");
}
}
Abstraction類:
抽象部分(Mobile)的抽象類
package com.bamboolmc.designpattern.BridgeMode;
public abstract class Mobile {
private ROM rom;
public Mobile(ROM rom) {
this.rom = rom;
}
public ROM getRom() {
return rom;
}
public void setRom(ROM rom) {
this.rom = rom;
}
public abstract void installROM();
}
Refined Abstraction類:
抽象部分(Mobile)的具體實(shí)現(xiàn)(Huawei/XiaoMi)
package com.bamboolmc.designpattern.BridgeMode;
public class HuaWei extends Mobile{
public HuaWei(ROM rom) {
super(rom);
}
@Override
public void installROM() {
System.out.println("HuaWei mobile:");
this.getRom().ConfigRom();
}
}
package com.bamboolmc.designpattern.BridgeMode;
public class XiaoMi extends Mobile{
public XiaoMi(ROM rom) {
super(rom);
}
@Override
public void installROM() {
System.out.println("XiaoMi mobile:");
this.getRom().ConfigRom();
}
}
Clicent類:
package com.bamboolmc.designpattern.BridgeMode;
public class BridgeClicent {
public static void main(String[] args){
ROM rom32g = new ROM_32();
Mobile huawei = new HuaWei(rom32g);
huawei.installROM();
ROM rom64g = new ROM_64();
Mobile xiaomi = new XiaoMi(rom64g);
xiaomi.installROM();
}
}
疑問
抽象部分和實(shí)現(xiàn)部分哪里進(jìn)行了橋接合呐?
抽象部分(Abstraction)保存一個(gè)對(duì)實(shí)現(xiàn)部分對(duì)象的引用暮的,針對(duì)上述的示例,具體如下:
引用一:
抽象部分Mobile保存一個(gè)對(duì)實(shí)現(xiàn)部分ROM的引用
public abstract class Mobile {
private ROM rom;
public Mobile(ROM rom) {
this.rom = rom;
}
}
具體使用時(shí)實(shí)現(xiàn):
public static void main(String[] args){
ROM rom32g = new ROM_32();
Mobile huawei = new HuaWei(rom32g);
}
適用環(huán)境
- 一個(gè)類存在兩個(gè)獨(dú)立變化的維度淌实,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展冻辩。
- 對(duì)于那些不希望使用繼承,或者使用多層繼承導(dǎo)致系統(tǒng)類個(gè)數(shù)急劇增長(zhǎng)的系統(tǒng)翩伪。
- 如果一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性微猖,避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系缘屹。
優(yōu)缺點(diǎn)
缺點(diǎn)
- 使用范圍的局限性凛剥,要求能夠正確識(shí)別獨(dú)立變化的維度。
- 聚合關(guān)聯(lián)關(guān)系在抽象層轻姿,增加了理解難度犁珠;要求開發(fā)者在抽象層中進(jìn)行設(shè)計(jì)與編程逻炊,增加了設(shè)計(jì)難度。
優(yōu)點(diǎn)
- 分離抽象部分與實(shí)現(xiàn)部分犁享,耦合度更低余素。
- 提高系統(tǒng)可擴(kuò)充性,維度任意變化炊昆,不影響原系統(tǒng)桨吊。
- 隱藏實(shí)現(xiàn)細(xì)節(jié),實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶不透明凤巨。