寒江雪 Go實現橋接模式

2021-08-16 18:45:51 字數 3371 閱讀 9663

bridge pattern說的是,當乙個系統中,包含乙個元件,該元件是可變的,該系統是可變的。這個時候就需要乙個橋連線抽象的系統和抽象的元件。

如果該系統包含多個其他的元件,這些元件都是可變的時候,也需要在該系統和這些元件之間架橋。

如果該系統包含的某個元件所包含的元件,是可變的,那麼遞迴地重複上述過程。

也就是說,在橋接模式中存在兩個抽象,這兩個抽象之間存在組合關係,為了防止類的數量膨脹,將它們分離出來分別實現,但由於存在包含關係,在上級中包含對下級抽象的引用。

看了很多資料都說的是將抽象與實現進行解耦,通俗地說就是,大系統包含小組件,大系統的某個方法需要依賴小組件的方法,不型別的小組件的實現不一樣,但是都能滿足大系統的需求,大系統無需關心小組件怎麼實現。大系統又分為很多種類,每個種類的大系統都會需要不同的小組件來實現自己的功能,根據需求的變化而變化。

為了應對這種變化,就需要乙個抽象類,表示大系統,其中包含了小組件的抽象類或介面,當我們需要開發新的元件的時候,就直接繼承小組件,並實現抽象方法就行了。當我們需要開發新的大系統的時候,就繼承大系統,實現相應的抽象方法就行了,橋接模式的優點在這裡就體現出來了,我們這時候就可以為不同的大系統與小組件之間做自由組合了。

舉個例子,這個例子優點複雜,其中還用了builder pattern來生成abstractprogram。

我們設想一下,作業系統和應用程式。作業系統執行應用程式並不需要知道應用程式具體是如何實現的。但是作業系統是由乙個個應用程式組成的。

因此,我們先來設計作業系統的介面,並實現它,同時寫兩個具體的系統:windows和linux。

package bridge

import (

"fmt"

"strings"

)// 命令列和應用程式的對映表

type registry map[string]iprogram

// 作業系統的通用介面

type ioperation inte***ce

// 抽象的作業系統

type operation struct

// 啟動

func (this *operation)boot()

// 執行

func (this *operation) executeprogram(cmd string) else

}// 安裝

func (this *operation) setupprogram(cmd string, program iprogram) else

}}// 構建

func (this *operation) build(program iprogram)

this.setupprogram(cmd,program)

}// windows

type windows struct

// windows 的啟動過程

func (this *windows) boot()

// linux

type linux struct

// linux的啟動過程

func (this *linux) boot()

然後我們來設計和實現應用程式

package bridge

import (

"fmt"

)// 程式通用介面

type iprogram inte***ce

// 程式的抽象

type abstractprogram struct

// 獲取程式名字

func (this *abstractprogram)getname()string

// 獲取程式命令列

func (this *abstractprogram)cmd()string

// 設定程式字尾名

func (this *abstractprogram)setsuffix(suffix string)

// 執行程式

// abstractprogram並不具體實現

// 為了讓abstractprogram看起來實現了iprogram介面

// 如果不寫這段就需要子結構強制實現run介面

func (this *abstractprogram)run()

type sing struct

func (this *sing)run()

type dog struct

func (this *dog)run()

最後,多餘的一步,希望更逼近現實情況,我們需要構建應用程式,就需要一些工具了,這裡使用了builder pattern來實現這個工具。

package bridge

type icoding inte***ce

type codeutil struct

func (this codeutil) writename(name string) icoding

func (this codeutil) writecmd(cmd string) icoding

func (this codeutil) compile() abstractprogram

return res

}func (this codeutil) getsingprogram(word string) sing

res.abstractprogram = this.writename("sing").writecmd("sing").compile()

res.word = word

return res

}func (this codeutil) getdogprogram() dog

res.abstractprogram = this.writename("dog").writecmd("dog").compile()

return res

}

func main()

// write programs

sing := ide.getsingprogram("hello world")

dog := ide.getdogprogram()

windows.build(&sing)

windows.build(&dog)

linux.build(&sing)

linux.build(&dog)

windows.executeprogram("dog")

windows.executeprogram("sing")

linux.executeprogram("sing")

linux.executeprogram("dog")

}

寒江雪 Go實現工廠模式

簡單工廠的實現思想,即建立乙個工廠,將產品的實現邏輯集中在這個工廠中。factory type foodfactory struct func ff foodfactory createfood name string food return s type food inte ce type mea...

寒江雪 Go實現觀察者模式

觀察者模式使得一種型別的例項可以傳送事件給其他型別,前提是接收事件的例項要根傳送者訂閱這個事件。先來定義要使用到的介面 package observer type event struct observer inte ce notifier inte ce 然後寫幾個簡單的型別實現這些介面 pack...

橋接模式的簡單實現

最近經常碰到橋接模式的需求。所謂橋接模式即 將網路側分配的ip 可能是公網ip,也可能是私網ip 直接分配給連線到該路由裝置的pc或其它上網裝置。解釋的不太清楚 之前畫的圖也一時找不到了,後續有空再把圖加上就會解釋的更清楚一些。具體實現 關閉 對wan口的dhcp 我這個裝置的wan口名稱是wan0...