設計模式學習-使用go實現橋接模式

Rick.lz發表於2021-11-11

橋接模式

前言

橋接模式的程式碼實現非常簡單,但是理解起來稍微有點難度,並且應用場景也比較侷限,所以,相當於代理模式來說,橋接模式在實際的專案中並沒有那麼常用,所以能分辨出來就行了,這裡不做重點的學習。

定義

橋接模式:將抽象部分和它的實現部分分離,使他們都可以獨立的變化。

看完定義還是一臉懵?

舉個例子吧:使用大話模式中的手機栗子來分析

我們知道不同品牌的手機以及不同品牌手機的不同版本對於手機軟體的要求是不一樣的,可能在M品牌中的軟體,就不能在N品牌的手機中使用。M品牌中10代版本的軟體可能就不能在1代版本中安裝使用。

我們如果使用程式碼去實現這種關係:

1、按照品牌分類實現的結構圖

bridge

2、按照軟體分類實現的結構圖

bridge

上面的第一種和第二種實現方式

如果對於手機品牌我們需要增加A,B,C三種,對於軟體,我們增加筆記,輸入法,鬧鐘。。。

那麼原來已經寫好的模組也需要修改,顯然這種修改是災難級別的,新功能的新增就需要很多模組被修改

3、使用橋接模式實現的結構圖

bridge

第三種也就是我們講的橋接模式,如果有手機品牌和軟體型別的加入,只需要進行擴充套件就好了,之前已經寫好的模組就不用修改了。

由於實現的方式是多種的,橋接模式的核心就是把這些實現獨立出來,讓他們自己變化。這樣每種變化不會影響到其他的實現,從而達到應對變化的目的。

優點

1、抽象與實現分離,擴充套件能力強

2、符合開閉原則

3、符合合成複用原則

4、其實現細節對客戶透明

通俗點講就是我們的實現系統可能有多角度的分類,每種類都有可能變化,橋架模式做的就是把這些多角度獨立出來,讓他們可以自己變化,而不影響其他的模組,減少他們之間的藕合。

缺點

橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與程式設計。

應用場景

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

2、對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。

3、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件。

程式碼實現

還是上面手機的栗子

// 手機軟體
type HandsetSoft interface {
	Run() string
}

// 手機遊戲
type HandsetGame struct {
}

func (hg *HandsetGame) Run() string {
	return "執行手機遊戲"
}

// 手機通訊錄
type HandsetAddressList struct {
}

func (hg *HandsetAddressList) Run() string {
	return "執行手機通訊錄"
}

// 手機品牌
type HandsetBrand interface {
	SetHandsetSoft(HandsetSoft)
}

// M品牌手機手機
type HandsetBrandM struct {
	HandsetSoft
}

func NewHandsetBrandM() *HandsetBrandM {
	return &HandsetBrandM{}
}

func (hw *HandsetBrandM) SetHandsetSoft(soft HandsetSoft) {
	hw.HandsetSoft = soft
}

func (hw *HandsetBrandM) Run() string {
	return "M品牌的手機-" + hw.HandsetSoft.Run()
}

// N品牌的手機
type HandsetBrandN struct {
	HandsetSoft
}

func NewHandsetBrandN() *HandsetBrandN {
	return &HandsetBrandN{}
}

func (ap *HandsetBrandN) SetHandsetSoft(soft HandsetSoft) {
	ap.HandsetSoft = soft
}

func (ap *HandsetBrandN) Run() string {
	return "N品牌的手機-" + ap.HandsetSoft.Run()
}

參考

【文中程式碼】https://github.com/boilingfrog/design-pattern-learning/tree/master/橋接模式
【大話設計模式】https://book.douban.com/subject/2334288/
【極客時間】https://time.geekbang.org/column/intro/100039001
【橋接模式】https://boilingfrog.github.io/2021/11/11/使用go實現橋接模式/

相關文章