簡介
1.橋接模式(Bridge模式)是指:將實(shí)現(xiàn)與抽象放在兩個(gè)不同的類的層次中,使得兩個(gè)層次可以獨(dú)立改變
2.是一種結(jié)構(gòu)型設(shè)計(jì)模式
3.Bridge模式基于類的最小設(shè)計(jì)原則,通過使用封裝.聚合以及繼承等行為讓不同的類承擔(dān)不同的職責(zé).它的主要特點(diǎn)就是把抽象(Abstraction)與行為實(shí)現(xiàn)(Implementation)分離開來,從而可以保持各部分的獨(dú)立性以及應(yīng)對他們功能的拓展
手機(jī)操作問題
現(xiàn)在對不同手機(jī)類型的不同品牌實(shí)現(xiàn)操作編程(比如打電話,開機(jī),關(guān)機(jī),上網(wǎng),等)
類圖
傳統(tǒng)方式解決手機(jī)問題分析
1.拓展性問題(類爆炸),如果我們再增加手機(jī)類的樣式(旋轉(zhuǎn)式),就需要增加各個(gè)品牌的手機(jī)的類,同樣如果我們增加一個(gè)手機(jī)品牌,也要在各個(gè)手機(jī)樣式下增加
2.違反了單一職責(zé)原則,當(dāng)我們增加手機(jī)樣式的時(shí)候,要同時(shí)增加所有品牌的手機(jī),這樣增加了代碼維護(hù)成本
3.解決方案 == >> 使用橋接模式
橋接模式原理 類圖
原理類圖說明
1.Client類:橋接模式的調(diào)用者
2.抽象類(Abstraction):維護(hù)了 Implementor / 即 他的實(shí)現(xiàn)類 ConcreteImplementorA .. 二者是聚合關(guān)系 Abstraction 充當(dāng)了橋接類
3.RefineAbstraction: 是 Abstraction 的子類
4.Implementor :行為實(shí)現(xiàn)類的的接口
5.ConcreteImplementorA /B 是行為的具體實(shí)現(xiàn)類
6.從UML圖可以看出 抽象類和接口是聚合的關(guān)系,其實(shí)是調(diào)用與被調(diào)用的關(guān)系
手機(jī)問題 使用 橋接模式 實(shí)現(xiàn)
代碼實(shí)現(xiàn)
public interface Brand {
void open();
void close();
void call();
}
public class XiaoMi implements Brand {
@Override
public void open() {
System.out.println("小米開機(jī)");
}
@Override
public void close() {
System.out.println("小米關(guān)機(jī)");
}
@Override
public void call() {
System.out.println("小米打電話");
}
}
public class Vivo implements Brand {
@Override
public void open() {
System.out.println("Vivo開機(jī)");
}
@Override
public void close() {
System.out.println("Vivo關(guān)機(jī)");
}
@Override
public void call() {
System.out.println("Vivo打電話");
}
}
public abstract class Phone {
// 組合品牌
private Brand brand;
// 構(gòu)造器
public Phone(Brand brand) {
super();
this.brand = brand;
}
protected void open() {
this.brand.open();
}
protected void close() {
this.brand.close();
}
protected void call() {
this.brand.call();
}
}
//折疊手機(jī)類
public class FoldedPhone extends Phone{
//構(gòu)造器
public FoldedPhone(Brand brand) {
super(brand);
}
public void open() {
super.open();
System.out.println(" 折疊手機(jī) open ");
}
public void close() {
super.close();
System.out.println(" 折疊手機(jī) close");
}
public void call() {
super.call();
System.out.println(" 折疊手機(jī) call");
}
}
public class UpRightPhone extends Phone {
// 構(gòu)造器
public UpRightPhone(Brand brand) {
super(brand);
}
public void open() {
super.open();
System.out.println(" 直立手機(jī) open");
}
public void close() {
super.close();
System.out.println(" 直立手機(jī) close");
}
public void call() {
super.call();
System.out.println(" 直立手機(jī) call");
}
}
測試
public class Client {
public static void main(String[] args) {
// 獲取折疊式手機(jī) 樣式+品牌
Phone phone = new FoldedPhone(new XiaoMi());
phone.open();
phone.close();
phone.call();
System.out.println("========================");
// 獲取折疊式手機(jī) 樣式+品牌
Phone phone1 = new FoldedPhone(new Vivo());
phone1.open();
phone1.close();
phone1.call();
System.out.println("========================");
// 獲取直立式手機(jī) 樣式+品牌
Phone phone2 = new UpRightPhone(new Vivo());
phone2.open();
phone2.close();
phone2.call();
System.out.println("========================");
// 獲取直立式手機(jī) 樣式+品牌
Phone phone3 = new UpRightPhone(new Vivo());
phone3.open();
phone3.close();
phone3.call();
}
}
打印結(jié)果
小米開機(jī)
折疊手機(jī) open
小米關(guān)機(jī)
折疊手機(jī) close
小米打電話
折疊手機(jī) call
========================
Vivo開機(jī)
折疊手機(jī) open
Vivo關(guān)機(jī)
折疊手機(jī) close
Vivo打電話
折疊手機(jī) call
========================
Vivo開機(jī)
直立手機(jī) open
Vivo關(guān)機(jī)
直立手機(jī) close
Vivo打電話
直立手機(jī) call
========================
Vivo開機(jī)
直立手機(jī) open
Vivo關(guān)機(jī)
直立手機(jī) close
Vivo打電話
直立手機(jī) call
橋接模式在JDBC源碼的分析
1.JDBC的Driver接口,如果從橋接模式來看,Driver就是一個(gè)接口.下面有Mysql的Driver.Oracle的Driver,這些就可以當(dāng)作是接口實(shí)現(xiàn)類
橋接模式的注意事項(xiàng)
1.實(shí)現(xiàn)了抽象和實(shí)現(xiàn)部分的分離,從而極大的提供了系統(tǒng)的靈活性,讓抽象的部分和實(shí)例部分隔離開來,這有助于系統(tǒng)進(jìn)行分層設(shè),從而產(chǎn)生更好的結(jié)構(gòu)化系統(tǒng)
2.對于系統(tǒng)的高層部分.只需要知道抽象部分和實(shí)現(xiàn)部分的接口就可以了,其他的部分有具體的業(yè)務(wù)來完成
3.橋接模式替代多層繼承方案,可以減少子類的個(gè)數(shù),降低系統(tǒng)的管理和維護(hù)成本
4.橋接模式的引入增加了系統(tǒng)的理解和設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計(jì)和編程
5.橋接模式要求正確識(shí)別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度,因此其使用范圍有一定的局限性,即需要有這樣的應(yīng)用場景
橋接模式的應(yīng)用場景
1.對于那些不希望使用繼承或因?yàn)槎鄬永^承導(dǎo)致系統(tǒng)的個(gè)數(shù)急劇增加的系統(tǒng),橋接模式尤為適用
2.常見的應(yīng)用場景
- JDBC驅(qū)動(dòng)程序
- 銀行轉(zhuǎn)賬系統(tǒng)
=轉(zhuǎn)賬分類:網(wǎng)上轉(zhuǎn)賬,柜臺(tái)轉(zhuǎn)賬.AMT轉(zhuǎn)賬
=轉(zhuǎn)賬用戶類型:普通用戶,銀卡賬戶.金卡賬戶 - 消息管理
=消息類型:即時(shí)消息 延時(shí)消息
=消息分類:手機(jī)短信,郵件信息,QQ消息