1、基本介紹
- 橋接模式(Bridge模式)是指:將實現與抽象放在兩個不同的類層次中,使兩個層 次可以獨立改變。
- 是一種結構型設計模式
- Bridge模式基於類的最小設計原則,通過使用封裝、聚合及繼承等行爲讓不同 的類承擔不同的職責。
- 它的主要特點是把抽象(Abstraction)與行爲實現 (Implementation)分離開來,從而可以保持各部分的獨立性以及應對他們的功能 擴展
2、原理類圖
原理類圖說明
- Client 類:橋接模式的調用者
- 抽象類(Abstraction) :維護了 Implementor / 即它的實現類 ConcreteImplementorA…, 二者是聚合關係, Abstraction充當橋接類
- RefinedAbstraction : 是 Abstraction 抽象類的子類
- Implementor : 行爲實現類的接口
- ConcreteImplementorA /B :行爲的具體實現類
- 從 UML 圖:這裏的抽象類和接口是聚合的關係,其實調用和被調用關係
3、以手機品牌與樣式爲例使用橋接模式
3.1 示例類圖
接口
//品牌類,行爲實現的接口
public interface Brand {
void open();
void close();
void call();
}
接口的具體實現
//小米品牌類,行爲的具體實現類
public class XiaoMi implements Brand {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println(" 小米手機開機 ");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println(" 小米手機關機 ");
}
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println(" 小米手機打電話 ");
}
}
//Vivo品牌類,行爲的具體實現類
public class Vivo implements Brand {
@Override
public void open() {
// TODO Auto-generated method stub
System.out.println(" Vivo 手機開機 ");
}
@Override
public void close() {
// TODO Auto-generated method stub
System.out.println(" Vivo 手機關機 ");
}
@Override
public void call() {
// TODO Auto-generated method stub
System.out.println(" Vivo 手機打電話 ");
}
}
抽象橋接
//手機類,抽象類充當橋接類
public abstract class Phone {
//聚合品牌
private Brand brand;
//構造器
public Phone(Brand brand) {
super();
this.brand = brand;
}
protected void open() {
this.brand.open();
}
protected void close() {
brand.close();
}
protected void call() {
brand.call();
}
}
抽象的具體實現
//摺疊式手機類,繼承 抽象類 Phone
public class FoldedPhone extends Phone {
//構造器
public FoldedPhone(Brand brand) {
super(brand);
}
public void open() { super.open();
System.out.println(" 摺疊樣式手機 ");
}
public void close() { super.close();
System.out.println(" 摺疊樣式手機 ");
}
public void call() { super.call();
System.out.println(" 摺疊樣式手機 ");
}
}
//直立式手機類,繼承 抽象類 Phone
public class UpRightPhone extends Phone {
//構造器
public UpRightPhone(Brand brand) {
super(brand);
}
public void open() {
super.open();
System.out.println(" 直立樣式手機 ");
}
public void close() {
super.close();
System.out.println(" 直立樣式手機 ");
}
public void call() {
super.call();
System.out.println(" 直立樣式手機 ");
}
}
調用抽象橋接
//客戶端調用
public class Client {
public static void main(String[] args) {
//獲取摺疊式手機 (樣式 + 品牌 )
Phone phone1 = new FoldedPhone(new XiaoMi());
phone1.open();
phone1.call();
phone1.close();
System.out.println("=======================");
Phone phone2 = new FoldedPhone(new Vivo());
phone2.open();
phone2.call();
phone2.close();
System.out.println("==============");
UpRightPhone phone3 = new UpRightPhone(new XiaoMi());
phone3.open();
phone3.call();
phone3.close();
System.out.println("==============");
UpRightPhone phone4 = new UpRightPhone(new Vivo());
phone4.open();
phone4.call();
phone4.close();
}
}
使用橋接模式後,之後無論是再增加手機樣式還是手機品牌,都非常方便。只需要在增加橋接的抽象子類或抽象接口的實現子類。
橋接模式的注意事項和細節
- 實現了抽象和實現部分的分離,從而極大的提供了系統的靈活性,讓抽象部分和實現部分獨立開來,這有助於系統進行分層設計,從而產生更好的結構化系統。
- 對於系統的高層部分,只需要知道抽象部分和實現部分的接口就可以了,其它的部分由具體業務來完成。
- 橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
- 橋接模式的引入增加了系統的理解和設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計和編程
- 橋接模式要求正確識別出系統中兩個獨立變化的維度(抽象、和實現),因此其使用範圍有一定的侷限性,即需要有這樣的應用場景。對於那些不希望使用繼承或因爲多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤爲適
常見的應用場景:
- JDBC 驅動程序
- 銀行轉賬系統
轉賬分類: 網上轉賬,櫃檯轉賬,AMT 轉賬(抽象)
轉賬用戶類型:普通用戶,銀卡用戶,金卡用戶…(實現) - 消息管理
消息類型:即時消息,延時消息(抽象)
消息分類:手機短信,郵件消息,QQ 消息…(實現)