1、概念準備設計模式
在理解橋接模式以前,先要理解面向對象程序設計中的兩個概念:ide
2、模式說明測試
若是類的設計都只有一層(程序中自定義的類不存在繼承關係),這時候類的功能層次結構和實現層次結構是混雜在一塊兒的,也很難擴展(沒法肯定應該繼承哪一個類來擴展功能,同一個方法若是想替換其實現也沒法作到)。所以須要按照上面說的,將類的功能層次和實現層次分開,爲了在分開後能繼續保持必定的聯繫,這時候就須要一個橋樑,將它們鏈接起來。(Bridge也有橋樑的意思,鏈接兩個事物)this
3、代碼示例spa
在下面的橋接模式代碼示例中,着重關注哪些時功能層次,哪些是實現層次,兩者又是如何橋接起來的。設計
一、類的功能層次結構code
Display類:Display類的功能是抽象的,負責「顯示」一些東西,它位於功能層次結構的最上層。open、print、close這三個方法是Display類提供的接口,它們定義了顯示的步驟,這三個方法調用的是Display實現類的對象。對象
package com.designpattern.cn.bridgepattern; public class Display { private DisplayImpl impl; public Display(DisplayImpl impl){ this.impl = impl; } public void open(){ impl.rawOpen(); } public void print(){ impl.rawPrint(); } public void close(){ impl.rawClose(); } public final void display(){ open(); print(); close(); } }
CountDisplay類:CountDisplay類在Display類的基礎上增長了一個新功能,具備「只顯示規定次數」的功能。所以,這屬於「類的功能層次範疇」。blog
package com.designpattern.cn.bridgepattern; public class CountDisplay extends Display { public CountDisplay(DisplayImpl impl){ super(impl); } public void multiDisplay(int times){ open(); for(int i=0; i < times; i++){ print(); } close(); } }
二、類的實現層次結構繼承
DisplayImpl類:位於「類的實現層次結構」的最上層。DisplayImpl是抽象類,聲明瞭rawOpen、rawPrint、rawClose三個抽象方法。
package com.designpattern.cn.bridgepattern; public abstract class DisplayImpl { public abstract void rawOpen(); public abstract void rawPrint(); public abstract void rawClose(); }
StringDisplayImpl類:它是仙子字符串的類,但它並非直接顯示字符串,而是繼承了DisplayImpl類,做爲子類來使用rawOpen、rawPrint、rawClose三個方法顯示字符串。
package com.designpattern.cn.bridgepattern; public class StringDisplayImpl extends DisplayImpl { private String string; private int width; public StringDisplayImpl(String string){ this.string = string; this.width = string.getBytes().length; } @Override public void rawOpen(){ printLine(); } @Override public void rawPrint(){ System.out.println("|" + string + "|"); } @Override public void rawClose() { printLine(); } private void printLine(){ System.out.print("+"); for(int i = 0; i < width; i++){ System.out.println("-"); } System.out.println("+"); } }
三、Main類測試結果
4、模式類圖
5、模式中的角色
那麼,這其中的橋樑Bridge是什麼呢?對於示例程序,Display類和DisplayImpl是如何關聯的,從程序中看出,這裏的橋樑應該是impl字段。
6、相關的設計模式
7、擴展