沐鳴怎麼當代理?_設計模式之橋接模式

橋接模式是結構型設計模式,橋接模式本身應對的是由於實際的需要,使用不同緯度的條件和方法,橋接模式可以將兩個類型分離出來,讓兩者之間都可以獨立的拓展,讓每一個類都更加符合單一職責。橋接模式與多層繼承方案有些不太相同,它讓兩個獨立變化的設計成為兩個獨立的繼承等級的類,並且在抽象簡歷一個抽象關係,該關係類似一條連接兩個繼承結構的橋。

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

什麼是橋接模式

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

橋接模式通過將繼承改為組合的方式來解決這個問題。具體來說,就是抽取其中一個維度並使之成為獨立的類層次, 這樣就可以在初始類中引用這個新層次的對象,從而使得一個類不必擁有所有的狀態和行為。橋接模式主要應對的是由於實際的需要,某個類具有兩個或者兩個以上的維度變化,如果只是用繼承將無法實現這種需要,或者使得設計變得相當臃腫。

橋接模式優缺點

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

正是通過具體實現的接口,把抽象部分和具體的實現分離開來,抽象部分相當於是使用實現部分接口的客戶程序,這樣抽象部分和實現部分就鬆散耦合了,從而可以實現相互獨立的變化。這樣一來,幾乎可以把所有面向抽象編寫的程序,都視作是橋接模式的體現,至少算是簡化的橋接模式,就算是廣義的橋接吧。

優點

可以創建與平台無關的類和程序

客戶端代碼僅與高層抽象部分進行互動,不會接觸到平台的詳細信息

新增抽象部分和實現部分之間不會互相影響

抽象部分專註於處理高層邏輯,實現部分處理平台細節

缺點

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

示例

橋接模式的主要角色如下:

抽象部分:提供高層控制邏輯,依賴於完成底層實際工作的實現對象

實現部分:為所有具體實現聲明通用接口。抽象部分僅能通過在這裏聲明的方法於實現對象交互

實現具體:包括特定於平台的代碼

精確抽象:提供控制邏輯的變體,與其父類一樣,他們通過通用實現接口與不同的實現進行交互

客戶端:僅關心如何與抽象部分合作。但是,客戶端需要將抽象對象與一個實現對象連接起來

類圖如下所示:


代碼示例:

// 實現接口角色
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();

總結

如果一個系統需要在構建的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間簡歷靜態的繼承關係,通過橋接模式可以使他們在抽象層建立關係。

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

站長推薦

1.雲服務推薦: 國內主流雲服務商,各類雲產品的最新活動,優惠券領取。地址:阿里雲騰訊雲華為雲

2.廣告聯盟: 整理了目前主流的廣告聯盟平台,如果你有流量,可以作為參考選擇適合你的平台點擊進入

鏈接: http://www.fly63.com/article/detial/9914