橋接模式是一種很實用的結構型設計模式,若是軟件系統中某個類存在兩個獨立變化的維度,經過該模式能夠將這兩個維度分離出來,使二者能夠獨立擴展,讓系統更加符合「單一職責原則」。與多層繼承方案不一樣,它將兩個獨立變化的維度設計爲兩個獨立的繼承等級結構,而且在抽象層創建一個抽象關聯,該關聯關係相似一條鏈接兩個獨立繼承結構的橋,故名橋接模式。
橋接模式用一種巧妙的方式處理多層繼承存在的問題,用抽象關聯取代了傳統的多層繼承,將類之間的靜態繼承關係轉換爲動態的對象組合關係,使得系統更加靈活,並易於擴展,同時有效控制了系統中類的個數。git
橋接模式(Bridge Pattern):將抽象部分與它的實現部分分離,使它們均可以獨立地變化。它是一種對象結構型模式,又稱爲柄體(Handle and Body)模式或接口(Interface)模式。編程
橋接模式的結構與其名稱同樣,存在一條鏈接兩個繼承等級結構的橋,橋接模式結構如圖所示:設計模式
鉛筆能夠分爲不一樣大小規格的,同時每個規格均可以選擇不一樣的顏色,規則和顏色做爲鉛筆的兩個維度,若是採用多層繼承的結構,每一個鉛筆規格下在提供不一樣顏色的子類,會致使系統中類的個數急劇增長,同時擴展麻煩,無論增長顏色仍是規格都須要增長大量的具體類。所以這邊使用橋接嘛事,將這兩個維度設計爲兩個獨立的繼承等級結構,爲兩個維度都提供抽象層,並創建抽象耦合。ide
一般狀況下,咱們將具備兩個獨立變化維度的類的一些普通業務方法和與之關係最密切的維度設計爲「抽象類」層次結構(抽象部分),而將另外一個維度設計爲「實現類」層次結構(實現部分)。測試
對於鉛筆而言,因爲規格型號是其固有的維度,所以能夠設計一個抽象的鉛筆類,在該類中聲明並部分實現鉛筆的業務方法,而將各類型號的鉛筆做爲其子類;顏色是鉛筆的另外一個維度,因爲它與鉛筆之間存在一種「設置」的關係,所以咱們能夠提供一個抽象的顏色接口,而將具體的顏色做爲實現該接口的子類。代碼以下:this
//輔助類,設置顏色的時候使用該類 public class Image { private String line; private String color; public String getLine() { return line; } public void setLine(String line) { this.line = line; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } @Override public String toString() { return "Image{" + "line='" + line + '\'' + ", color='" + color + '\'' + '}'; } } //抽象鉛筆類 public abstract class AbstractPencil { protected IColorImp color; public void setColorImp(IColorImp color) { this.color = color; } public abstract void draw(); } //抽象顏色設置實現類:實現類接口 public interface IColorImp { void setColor(Image image); } //紅色設置實現類:具體實現類 public class RedColorImp implements IColorImp { @Override public void setColor(Image image) { image.setColor("紅色"); } } //綠色設置實現類:具體實現類 public class GreenImpl implements IColorImp { @Override public void setColor(Image image) { image.setColor("綠色"); } } //大號鉛筆:擴充抽象類 public class BigPencil extends AbstractPencil { @Override public void draw() { Image image=new Image(); image.setLine("大"); //其餘代碼 color.setColor(image); //其餘代碼 System.out.println(image); } } //小號鉛筆:擴充抽象類 public class SmallPencil extends AbstractPencil { @Override public void draw() { Image image=new Image(); image.setLine("小"); //其餘代碼 color.setColor(image); //其餘代碼 System.out.println(image); } } //測試類 public class Client { public static void main(String[] args) { AbstractPencil pencil=new BigPencil(); IColorImp colorImp=new RedColorImp(); pencil.setColorImp(colorImp); pencil.draw(); } } //Image{line='大', color='紅色'}
可以使用配置文件來選定特定型號的鉛筆和顏色,當添加新的鉛筆尺寸型號或者顏色的時候,只需增長一個對應的擴充抽象類或具體實現類便可,系統具備較好的可擴展性,徹底符合「開閉原則」。設計
在軟件開發中,適配器模式一般能夠與橋接模式聯合使用。適配器模式能夠解決兩個已有接口間不兼容問題,在這種狀況下被適配的類每每是一個黑盒子,有時候咱們不想也不能改變這個被適配的類,也不能控制其擴展。適配器模式一般用於現有系統與第三方產品功能的集成,採用增長適配器的方式將第三方類集成到系統中。橋接模式則不一樣,用戶能夠經過接口繼承或類繼承的方式來對系統進行擴展。3d
橋接模式和適配器模式用於設計的不一樣階段,橋接模式用於系統的初步設計,對於存在兩個獨立變化維度的類能夠將其分爲抽象化和實現化兩個角色,使它們能夠分別進行變化;而在初步設計完成以後,當發現系統與已有類沒法協同工做時,能夠採用適配器模式。但有時候在設計初期也須要考慮適配器模式,特別是那些涉及到大量第三方應用接口的狀況。code
在軟件開發中若是一個類或一個系統有多個變化維度時,均可以嘗試使用橋接模式對其進行設計,而不是採用多層繼承的方案。將其抽象部分與實現部分分離,下降系統的複雜度。