1、前言編程
寫到這裏,基本上就是前面幾種模式的擴展和區別了,能夠看到咱們前面的幾種模式,不少時候都出現了重疊,這裏要分清一個概念,模式並非徹底隔離和獨立的,有的模式內部其實用到了其它模式的技術,可是又有本身的創新點,若是一味地認爲每一個模式都是獨一無二的,與其它模式徹底區別的,這是一種誤區,所以,這裏又看到了基礎知識的重要性。從不一樣的角度都有各自的共同性,好比從人的角度,每一個人都是不一樣的,可如果從原子分子的角度,每一個人又是相同的,那究竟是相同仍是不通,取決於咱們看問題的角度。所以,咱們要學會求同辨異!橋接模式是一種將類的功能層次和實現層次分離的技術,所謂類的功能層次指的是類要實現什麼功能,要定義多少個函數進行處理,在功能之中咱們會用到繼承來定義新的方法同時也能使用父類的方法,這就構成了一個層次「父類-子類-孫類...」,這就是功能層次,與之對應的就是實現層次了,其實很好理解,若是咱們事先肯定了完成一件事情的最基本的子功能,那麼咱們定義這些子功能爲接口或者抽象類,而後使用實現類來進行實現,這樣一個抽象類,多個實現類,這樣的結構就是實現層次,能夠看到高度一直爲2,而功能層次高度爲N(N爲繼承的層次)。那麼可不能夠將二者分離呢,一方面咱們知道一個類的基礎子功能而且可以使用到這些子功能的實現,另外一方面咱們能夠在這些子功能的基礎上定義出咱們本身須要的功能(功能層次),若是能夠的話,基本的元素就至關於空氣、水分等元素,而咱們須要的功能就是將這些東西組成一種種不一樣的物質。這裏就用到了委託,或者說是組合。實現了功能層次和實現層次分離的結構,咱們稱之爲橋接模式。設計模式
2、代碼ide
如上圖所示,只有DisplayImpl是抽象類,其餘都是具體類,其實DisplayImpl也能夠改爲接口,這在原理和理念上都是一致的。在實現層次,定義了三個rawXX元,而後對這些元素進行實現(StringDisplayImpl),這樣就保證了可擴展性,咱們能夠實現不少這樣的類,可是高度一直都不變,是一個平行關係。對於功能層次,主要是對實現類中的元素進行操做,一樣的使用方法對其進行簡單的封裝,便於子類的繼承和使用,由於咱們定義的displayImpl是私有的,這種組合或者說委託關係,咱們在builder模式中確定很熟悉,這裏要說一些區別,首先是思想上的區別,採用橋接模式,就是要將功能層次剝離,所以功能層次上必須有繼承,這樣纔有意義,另外,對於元素的組織上,builder是定義了一個操做,這個操做有順序的對元素進行處理,不管實現層次上實現了多少個類,都要按照這個順序來處理,而橋接模式,咱們能夠定義新的操做,能夠靈活地使用元素,能夠隨意的增長新的功能,定義新的順序,這是一個很大的不一樣;另外在於main對類的使用上,對於builder模式,咱們可能最後使用對應於實現層次上的一些方法來獲得結果,而在橋接模式,咱們原本就是面向接口編程,所以代碼中只是使用實現層次中的實現類new一個對象而後就可使用了,沒有這種複雜的關聯關係。同時關於實現層次的實現類,爲了很好的創造對象,咱們可能使用抽象工廠模式來建立對象,須要根據實際狀況來取捨。理解了這一點,咱們來看一下代碼。函數
DisplayImpl類:雖然是實現層次,但倒是抽象的。組件化
package designMode.bridge; public abstract class DisplayImpl { public abstract void rawOpen(); public abstract void rawPrint(); public abstract void rawClose(); }
StringDisplayImpl類:ui
package designMode.bridge; public class StringDisplayImpl extends DisplayImpl { String name; public StringDisplayImpl(String name) { this.name = name; } @Override public void rawOpen() { printline(); } private void printline(){ System.out.println("==================="); } @Override public void rawPrint() { System.out.println("|||||"+name+"|||||"); } @Override public void rawClose() { printline(); } }
Display類:this
package designMode.bridge; public class Display { DisplayImpl displayImpl; public Display(DisplayImpl displayImpl) { this.displayImpl = displayImpl; } public void open(){ displayImpl.rawOpen(); } public void print(){ displayImpl.rawPrint(); } public void close(){ displayImpl.rawClose(); } public final void display(){ open(); print(); close(); } }
CountDisplay類:spa
package designMode.bridge; public class CountDisplay extends Display { public CountDisplay(DisplayImpl displayImpl) { super(displayImpl); } public final void mutilDisplay(){ open(); for (int i = 0; i < 5; i++) { print(); } close(); } }
main類:.net
package designMode.bridge; public class Main { public static void main(String[] args) { Display display = new Display(new StringDisplayImpl("江疏影")); display.display(); CountDisplay cd = new CountDisplay(new StringDisplayImpl("素小暖")); cd.display(); cd.mutilDisplay(); } }
3、總結設計
從上面咱們能夠看到這種方式的實現的好處,首先若是咱們想使用這些元素作其它的事情,咱們只須要繼承功能層次的類便可,若是咱們向增長新元素,咱們只須要修改實現層次的上下兩層的方法,而後就可使用了,這樣思路很是清晰,將功能和組成功能的子功能的實現隔離開來,能夠隨意的組合,便於組件化編程,好比咱們將實現層次做爲組件,咱們只須要使用委託將咱們想要實現的功能託付給實現層次來完成就行了,大大的提升了可重用性。那麼到底什麼是橋接模式呢,在哪裏實現呢?我想你們都知道了,那就是在委託的地方體現了,這就是橋,一座溝通功能層次和實現層次的橋。由此咱們也看到,設計模式其實就是爲了最大限度的實現代碼的可重用性,爲此可謂是絞盡腦汁,實現了以後就可以組件化,可移植,可擴展,從而高內聚低耦合,設計模式,咱們已經漸漸地感覺到了提取的初衷和意義。