橋接模式
今天我們繼續學習 23 種設計模式中的第七種——橋接模式。所謂橋接模式就是將抽象部分和實現部分隔離開來,使得它們能夠獨立變化。橋接模式將繼承關係轉化成關聯關係,封裝了變化,完成了解耦,減少了系統中類的數量,也減少了代碼量。
概念:
橋接模式是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。
如果說某個系統能夠從多個角度來進行分類,且每一種分類都可能會變化,那麼我們需要做的就是將這多個角度分離出來,使得它們能獨立變化,減少他們之間的耦合,這個分離過程就使用了橋接模式。
特點:
優點:
- 抽象與實現分離,所以擴展性好
- 實現細節對客戶透明
缺點:
- 由於聚合關係建立在抽象層,要求開發者針對抽象層進行設計與編程,這增加了系統的理解與設計難度。
類圖分析:
代碼:
手機品牌接口
package cn.ppdxzz.bridge;
/**
* Description:手機品牌接口
* @Author: PeiChen JavaAnything
*/
public interface Brand {
void open(); //開機
void call(); //打電話
void close(); //關機
}
OPPO品牌的手機
package cn.ppdxzz.bridge;
/**
* Description:OPPO品牌的手機
* @Author: PeiChen JavaAnything
*/
public class Oppo implements Brand {
@Override
public void open() {
System.out.println("oppo手機開機");
}
@Override
public void call() {
System.out.println("oppo手機打電話");
}
@Override
public void close() {
System.out.println("oppo手機關機");
}
}
vivo品牌的手機
package cn.ppdxzz.bridge;
/**
* Description:vivo品牌的手機
* @Author: PeiChen JavaAnything
*/
public class Vivo implements Brand {
@Override
public void open() {
System.out.println("vivo手機開機");
}
@Override
public void call() {
System.out.println("vivo手機開機");
}
@Override
public void close() {
System.out.println("vivo手機開機");
}
}
手機抽象類
package cn.ppdxzz.bridge;
/**
* Description:手機抽象類
* @Author: PeiChen JavaAnything
*/
public abstract class Phone {
//品牌注入到手機中
private Brand brand;
public Phone() {
}
public Phone(Brand brand) {
this.brand = brand;
}
protected void open() {
brand.open();
}
protected void call() {
brand.call();
}
protected void close() {
brand.close();
}
}
觸摸式手機
package cn.ppdxzz.bridge;
/**
* Description:觸摸式手機
* @Author: PeiChen JavaAnything
*/
public class TouchPhone extends Phone {
public TouchPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("觸摸式手機");
}
@Override
public void call() {
super.call();
System.out.println("觸摸式手機");
}
@Override
public void close() {
super.close();
System.out.println("觸摸式手機");
}
}
摺疊式手機
package cn.ppdxzz.bridge;
/**
* Description:摺疊式手機
* @Author: PeiChen JavaAnything
*/
public class FoldedPhone extends Phone {
public FoldedPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("摺疊式手機");
}
@Override
public void call() {
super.call();
System.out.println("摺疊式手機");
}
@Override
public void close() {
super.close();
System.out.println("摺疊式手機");
}
}
成品手機
package cn.ppdxzz.bridge;
/**
* Description:橋接模式(手機不同樣式不同品牌的案例)
* @Author: PeiChen JavaAnything
*/
public class Client {
public static void main(String[] args) {
System.out.println("(=====oppo品牌的手機=====)");
Phone phone1 = new TouchPhone(new Oppo());
phone1.open();
phone1.call();
phone1.close();
System.out.println("(=====vivo品牌的手機=====)");
Phone phone2 = new FoldedPhone(new Vivo());
phone2.open();
phone2.call();
phone2.close();
}
}
演示:
橋接模式在 JDBC 中的源碼分析
)
分析:
JDBC 中的 Driver 接口,如果從橋接模式來看,Driver 就是一個接口,下面可以有 MySQL 的 Driver,Oracle 的 Driver,這些就可以當做實現接口類。Driver 和 Connection 之間通過 DriverManager 橋接。
總結:
- 橋接模式使抽象和實現的進行分離,極大的提高了系統的靈活性,這有助於系統進行分層設計,從而產生更好的結構化系統。
- 橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
- 橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與編程。
橋接模式的講解就先到這裏,另外橋接模式要求正確識別出系統中兩個獨立變化的維度(抽象和實現),因此其使用範圍具有一定的侷限性。
使抽象和實現的進行分離,極大的提高了系統的靈活性,這有助於系統進行分層設計,從而產生更好的結構化系統。
- 橋接模式替代多層繼承方案,可以減少子類的個數,降低系統的管理和維護成本。
- 橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與編程。
橋接模式的講解就先到這裏,另外橋接模式要求正確識別出系統中兩個獨立變化的維度(抽象和實現),因此其使用範圍具有一定的侷限性。
微信公衆號,JavaAnything,期待你的關注!