設計模式之橋接模式

橋接模式

橋接模式是的一種對象結構型模式,它將對象的抽象與實現分離,從而可以獨立地改變它們,比如我們在JDBC中用到橋接模式,切換不同類型的數據庫,只需要切換不同類型的數據庫驅動就可以,而不需要改動太多的代碼或者配置。

定義
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。

使用場景

  1. 如果你不希望在抽象和實現部分採用固定的綁定關係,可以採用橋接模式,來把抽象和實現部分分開,然後在程序運行期間來動態的設置抽象部分需要用到的具體的實現,還可以動態切換具體的實現。
  2. 類的抽象以及它的實現都應該可以通過生成子類的方法加以擴充。這時橋接模式使你可以對不同的抽象接口和實現部分進行組合,並分別對它們進行擴充。
  3. 如果希望實現部分的修改,不會對客戶產生影響,可以採用橋接模式,客戶是面向抽象的接口在運行,實現部分的修改,可以獨立於抽象部分,也就不會對客戶產生影響了,也可以說對客戶是透明的。
  4. 如果採用繼承的實現方案,會導致產生很多子類,對於這種情況,可以考慮採用橋接模式,分析功能變化的原因,看看是否能分離成不同的緯度,然後通過橋接模式來分離它們,從而減少子類的數目。

結構
橋接模式結構圖

實現
TV接口與具體類的實現

public interface ITV {

    void on();
    void off();
    void switchChannel(int channel);
}

public class SonyTV implements ITV {

    public void on() {
        System.out.println("SonyTV has turn on");
    }

    public void off() {
        System.out.println("SonyTV has turn off");
    }

    public void switchChannel(int channel) {
        System.out.println("SonyTV switch to channel "+channel);
    }

}

public class SamsungTV implements ITV {

    public void on() {
        System.out.println("SamsungTV has turn on");
    }

    public void off() {
        System.out.println("SamsungTV has turn off");
    }

    public void switchChannel(int channel) {
        System.out.println("SamsungTV switch to channel "+channel);
    }

}

遙控器抽象與具體類的實現

public abstract class AbstractRemoteControl {

    private ITV tv;

    public AbstractRemoteControl(ITV tv) {
        this.tv = tv;
    }

    protected  void turnOn(){
        tv.on();
    }

    protected  void turnOff(){
        tv.off();
    }

    protected void setChannel(int channel){
        tv.switchChannel(channel);
    }
}

public class LogitechRemoteControl extends AbstractRemoteControl {

    public LogitechRemoteControl(ITV tv) {
        super(tv);
    }

    public void turnOn(){
        super.turnOn();
    }

    public void turnOff(){
        super.turnOff();
    }

    public void setChannel(int channel){
        super.setChannel(channel);
    }
}

當我們修改TV接口的具體實現時,對於遙控器類是無感知的,同樣的修改遙控器類的具體實現時,對於TV類也是透明的,當然我們也可以很容易的擴充產品,只有實現接口或者繼承抽象類。有興趣的朋友可以查看一下JDBC的代碼,可以發現DriverManager類和Driver接口就是橋接關係,因此能實現靈活的擴展,只要產商提供Driver的實現就OK。

發佈了34 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章