設計模式之橋接模式

橋接模式是結構型設計模式,橋接模式自己應對的是因爲實際的須要,使用不一樣緯度的條件和方法,橋接模式能夠將兩個類型分離出來,讓二者之間均可以獨立的拓展,讓每個類都更加符合單一職責。橋接模式與多層繼承方案有些不太相同,它讓兩個獨立變化的設計成爲兩個獨立的繼承等級的類,而且在抽象簡歷一個抽象關係,該關係相似一條鏈接兩個繼承結構的橋。編程

橋接模式用了一種巧妙的方式處理多層繼承存在的問題,用抽象關聯取代傳統的多層繼承關係,將類與靜態繼承關係轉換成動態的對象組合關係,是得系統更加靈活,易於拓展,同時有效的控制系統類中類的個數。設計模式

什麼是橋接模式

橋接模式:橋接模式是將抽象部分與它的實現部分分離,使它們均可以獨立地變化。它是一種對象結構型模式,又稱爲柄體(Handle and Body)模式或接口(interface)模式。 ——節選自百度百科this

橋接模式經過將繼承改成組合的方式來解決這個問題。具體來講,就是抽取其中一個維度並使之成爲獨立的類層次, 這樣就能夠在初始類中引用這個新層次的對象,從而使得一個類沒必要擁有全部的狀態和行爲。橋接模式主要應對的是因爲實際的須要,某個類具備兩個或者兩個以上的維度變化,若是隻是用繼承將沒法實現這種須要,或者使得設計變得至關臃腫。spa

橋接模式優缺點

橋接模式中的抽象部分持有具體實現部分的接口,最終目的是經過調用具體實現部分的接口中的方法,進一步完成必定的功能,這跟直接使用接口沒有什麼差別,只是表現形式略有不一樣而已。其次,使用接口的客戶程序也能夠持有相應的接口對象,這樣從形式上就同樣了。也就是說,從某個角度來說,橋接模式是面向抽象編程這個設計原則的擴展。設計

正是經過具體實現的接口,把抽象部分和具體的實現分離開來,抽象部分至關因而使用實現部分接口的客戶程序,這樣抽象部分和實現部分就鬆散耦合了,從而能夠實現相互獨立的變化。這樣一來,幾乎能夠把全部面向抽象編寫的程序,都視做是橋接模式的體現,至少算是簡化的橋接模式,就算是廣義的橋接吧。code

優勢
  1. 能夠建立與平臺無關的類和程序
  2. 客戶端代碼僅與高層抽象部分進行互動,不會接觸到平臺的詳細信息
  3. 新增抽象部分和實現部分之間不會互相影響
  4. 抽象部分專一於處理高層邏輯,實現部分處理平臺細節
缺點

對高內聚的類使用橋接模式可能會讓代碼更加複雜化對象

示例

橋接模式的主要角色以下:blog

  1. 抽象部分:提供高層控制邏輯,依賴於完成底層實際工做的實現對象
  2. 實現部分:爲全部具體實現聲明通用接口。抽象部分僅能經過在這裏聲明的方法於實現對象交互
  3. 實現具體:包括特定於平臺的代碼
  4. 精確抽象:提供控制邏輯的變體,與其父類同樣,他們經過通用實現接口與不一樣的實現進行交互
  5. 客戶端:僅關心如何與抽象部分合做。可是,客戶端須要將抽象對象與一個實現對象鏈接起來

類圖以下所示:繼承

image

代碼示例:接口

// 實現接口角色
interface Implementor {
    doSomething() : void;
    doAnything() : void;
}

// 具體實現角色
class ConcreteImplementor1 implements Implementor {
    public doSomething() : void {

    }
    public doAnything() : void {

    }
}
class ConcreteImplementor2 implements Implementor {
    public doSomething() : void {

    }
    public doAnything() : void {
        
    }
}

// 抽象類
abstract class Abstraction {
    private imp : Implementor;
    constructor(imp : Implementor) {
        this.imp = imp;
    }

    // 自身的行爲和屬性
    public request() : void {
        this.imp.doSomething();
    }
}
// 具體抽象化角色
class RefinedAbstraction extends Abstraction {
    constructor(imp : Implementor) {
        super(imp);
    }

    public request() : void {
        // 本身寫一些處理業務
        super.request();
    }
}

// 調用
// 定義一個實現化角色
const imp : Implementor = new ConcreteImplementor1();
// 定義一個抽象化角色
const abs : Abstraction = new RefinedAbstraction(imp);
// 執行上下文
abs.request();

總結

若是一個系統須要在構建的抽象化角色和具體化角色之間增長更多的靈活性,避免在兩個層次之間簡歷靜態的繼承關係,經過橋接模式可使他們在抽象層創建關係。

抽象化角色和實現化角色能夠以繼承的方式獨立擴展而互不影響,在程序運行時能夠動態將一個抽象化子類的對象和一個實現化子類的對象進行組合,即系統須要對抽象化角色和實現化角色進行動態耦合。

相關文章
相關標籤/搜索