1. 程式人生 > >golang設計模式(8)橋接模式

golang設計模式(8)橋接模式

橋接模式意圖
橋接模式將抽象部分與它的實現部分分離,使它們可以獨立變化。

適用性
以下情況適合使用橋接模式:
.不希望在抽象和它的實現部分之間有一個固定的繫結關係。比如這種情況可能是因為在程式執行時刻實現部分應可以被選擇或者切換。
.類的抽象以及它的實現應該可以通過生成子類的方法加以擴充。
.對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的程式碼不必重新編譯。
.一個型別存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件。

結構
橋接模式uml

參與者
.abstractioin
–定義抽象類的介面
–維護一個指向Implementor型別物件的指標
.RefinedAbstraction
–擴充由abstraction定義的介面
.Implementor
–定義實現類的介面,該介面不一定要與abstraction的介面完全一致;事實上這兩個介面也可以完全不同。一般來講,implementor介面僅提供基本操作,而abstraction定義了基於這些操作的較高層次的操作。
.ConcreteImplementor
實現Implementor介面並定義它的具體實現。

橋接模式的作用
橋接模式有以下優點:
1)分離介面及其實現部分:一個實現未必不變地繫結在一個介面上,抽象類的實現可在執行時刻進行配置,一個物件甚至可以在執行時刻改變它的實現。將abstraction與Implementor分離有助於降低對實現部分編譯時刻的依賴性,當改變一個實現類時,不需要重新編譯abstraction類和客戶重新。為了保證一個類庫的不同版本之間二進位制相容性,一定要有這個性質。另外,介面和實現分離有助於分層,從而產生更好的結構化系統,系統的高層部分只要知道abstraction和implementor即可。
2)提高可擴充套件性,可以獨立對Abstraction和Implementor層次進行擴充套件。
3)實現細節對可對客戶透明。

缺點:
不容易設計,需不需要分離,如何分離等問題。比較難以拿捏。

實現

package main

import (
    "fmt"
)

type Company interface {
    Runing()
}

type BigCompany struct {
    Worker
}

func (pB *BigCompany) Running() {
    fmt.Println("員工都是螺絲釘")
    pB.Worker.Leaving()
    fmt.Println("員工跑路後隨時可以找人頂替")
}

type SmallCompany struct
{ Worker } func (pS *SmallCompany) Running() { fmt.Println("隨便一個員工都是骨幹") pS.Worker.Leaving() fmt.Println("員工跑路後,公司運轉受阻") } type Worker interface { Leaving() } type GoodWorker struct { } func (pG *GoodWorker) Leaving() { fmt.Println("好員工跑路後") } type NormalWorker struct { } func (pN *NormalWorker) Leaving() { fmt.Println("普通員工跑路後") } func main() { pgoodworker := &GoodWorker{} pnormalworker := &NormalWorker{} pbigCompany := &BigCompany{Worker: pgoodworker} pbigCompany.Running() pbigCompany2 := &BigCompany{Worker: pnormalworker} pbigCompany2.Running() psmallCompany := &SmallCompany{Worker: pgoodworker} psmallCompany.Running() psmallCompany2 := &SmallCompany{Worker: pnormalworker} psmallCompany2.Running() return }

執行結果:

員工都是螺絲釘
好員工跑路後
員工跑路後隨時可以找人頂替
員工都是螺絲釘
普通員工跑路後
員工跑路後隨時可以找人頂替
隨便一個員工都是骨幹
好員工跑路後
員工跑路後,公司運轉受阻
隨便一個員工都是骨幹
普通員工跑路後
員工跑路後,公司運轉受阻