Golang面試寶典——Go語言實現(xiàn)23種設(shè)計模式之結(jié)構(gòu)型模式(下)

關(guān)于Golang面試寶典

最近幾年,Go的熱度持續(xù)飆升絮重,國內(nèi)外很多大公司都在大規(guī)模的使用Go冤寿。Google是Go語言誕生的地方,其他公司如Facebook青伤、騰訊督怜、阿里、字節(jié)跳動潮模、百度亮蛔、京東、小米等都在擁抱和轉(zhuǎn)向Go擎厢。Go語言的開源項目也非常多究流,如kubernetes辣吃、docker、etcd芬探。

隨著市場對Go語言人才需求的增長神得,很多開發(fā)者都投入了Go語言的懷抱。本系列文章將以第一視角與大家一同開始Golang的面試之路偷仿,希望大家能夠有所收獲哩簿,拿下心儀的offer。

使用Go實現(xiàn)23種設(shè)計模式——結(jié)構(gòu)型模式(下)

外觀模式

隱藏系統(tǒng)的復(fù)雜性酝静,并向客戶端提供了一個客戶端可以訪問系統(tǒng)的接口节榜,使得這一子系統(tǒng)更加容易使用

適用場景

  1. 為一個復(fù)雜子系統(tǒng)提供一個簡單接口供外界訪問

Go語言實現(xiàn)

type Animal struct {
    dog *Dog
    cat *Cat
}

func NewAnimal() *Animal {
    return &Animal{
        dog: &Dog{},
        cat: &Cat{},
    }
}

func (a *Animal) Speak() {
    a.dog.Speak()
    a.cat.Speak()
}

type Dog struct {}

func (a *Dog) Speak() {
    fmt.Println("汪汪汪")
}

type Cat struct {}

func (a *Cat) Speak() {
    fmt.Println("喵喵喵")
}

func main() {
    a := NewAnimal()
    a.Speak()
}

外觀模式優(yōu)點

  1. 降低了子系統(tǒng)與客戶端之間的耦合度肥照,子系統(tǒng)的變化不影響調(diào)用它的客戶端
  2. 對客戶屏蔽了子系統(tǒng)組件耕陷,減少了客戶端處理對象的數(shù)目并使得子系統(tǒng)使用更加方便

外觀模式缺點

  1. 不能很好的限制客戶使用子系統(tǒng)類桩匪,容易帶來未知風(fēng)險
  2. 增加新的子系統(tǒng)可能需要修改外觀類坑律,違背了"開閉原則"

享元模式

運用共享技術(shù)有效的支持大量細(xì)粒度的對象

適用場景

  1. 如果程序中使用了大量的對象,且這些對象造成了很大的儲存開銷
  2. 如果對象的大多數(shù)狀態(tài)可以給外部狀態(tài)锰悼,如果刪除對象的外部狀態(tài)勒极,可以用相對較少的共享對象取代很多對象

Go語言實現(xiàn)

type IFlyWeight interface {
    Run()
}

type FlyWeight struct {
    key string
}

func (f FlyWeight) Run() {
    fmt.Println(f.key)
}

type FactoryFlyWeight struct {
    flyWeight map[string]FlyWeight
}

func NewFactoryFlyWeight() *FactoryFlyWeight {
    return &FactoryFlyWeight{flyWeight: make(map[string]FlyWeight)}
}

func (f *FactoryFlyWeight) GetFlyWeight(key string) (fly FlyWeight) {
    var ok bool
    if fly, ok = f.flyWeight[key]; !ok {
        fly = FlyWeight{key: key}
        f.flyWeight[key] = fly
    }
    return fly
}

func (f *FactoryFlyWeight) Count() int {
    return len(f.flyWeight)
}

func main() {
    a :=  NewFactoryFlyWeight()
    a.GetFlyWeight("A").Run()
    a.GetFlyWeight("A").Run()
    a.GetFlyWeight("B").Run()
    fmt.Println(a.Count())
}

享元模式優(yōu)點

  1. 減少對象的創(chuàng)建饲帅,提高效率
  2. 縮小內(nèi)存中對象的數(shù)量

享元模式缺點

  1. 使系統(tǒng)更加復(fù)雜敞恋,需要分離出內(nèi)部狀態(tài)和外部狀態(tài)丽啡,使得程序的邏輯更加復(fù)雜
  2. 享元對象狀態(tài)外部化,使運行時間變長

代理模式

為其他對象提供一種代理以控制對這個對象的訪問

適用場景

  1. 監(jiān)控硬猫、統(tǒng)計补箍、鑒權(quán)、限流等

Go語言實現(xiàn)


type IExecutor interface {
    RunFunc()
}

type SyncExecutor struct {
}

func (e SyncExecutor) RunFunc() {
    time.Sleep(time.Second)
}

type ExecutorProxy struct {
    executor IExecutor
}

func NewExecutorProxy(e IExecutor) *ExecutorProxy {
    return &ExecutorProxy{executor: e}
}

func (e *ExecutorProxy) RunFunc() {
    start := time.Now()
    e.executor.RunFunc()
    fmt.Printf("運行用時: %+v", time.Since(start))
}

func main() {
    a := NewExecutorProxy(proxy.SyncExecutor{})
    a.RunFunc()
}

代理模式優(yōu)點

  1. 在客戶端和目標(biāo)對象間起到一個中介作用浦徊,保護目標(biāo)對象
  2. 可以擴展目標(biāo)對象的功能
  3. 將客戶端和目標(biāo)對象分離馏予,降低了系統(tǒng)耦合度,增加了程序的可擴展性

代理模式缺點

  1. 使系統(tǒng)設(shè)計中類的數(shù)量增多盔性,增加了系統(tǒng)的復(fù)雜度
  2. 在客戶端和目標(biāo)對象間增加一個代理對象,請求速度變慢
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呢岗,一起剝皮案震驚了整個濱河市冕香,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌后豫,老刑警劉巖悉尾,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異挫酿,居然都是意外死亡构眯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門早龟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惫霸,“玉大人猫缭,你說我怎么就攤上這事∫嫉辏” “怎么了猜丹?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硅卢。 經(jīng)常有香客問我射窒,道長,這世上最難降的妖魔是什么将塑? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任脉顿,我火速辦了婚禮,結(jié)果婚禮上点寥,老公的妹妹穿的比我還像新娘弊予。我一直安慰自己,他們只是感情好开财,可當(dāng)我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布汉柒。 她就那樣靜靜地躺著,像睡著了一般责鳍。 火紅的嫁衣襯著肌膚如雪碾褂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天历葛,我揣著相機與錄音正塌,去河邊找鬼。 笑死恤溶,一個胖子當(dāng)著我的面吹牛乓诽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咒程,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸠天,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了帐姻?” 一聲冷哼從身側(cè)響起稠集,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饥瓷,沒想到半個月后剥纷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡呢铆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年晦鞋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡悠垛,死狀恐怖线定,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鼎文,我是刑警寧澤渔肩,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站拇惋,受9級特大地震影響周偎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撑帖,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一蓉坎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胡嘿,春花似錦蛉艾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缴罗,卻和暖如春助琐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背面氓。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工兵钮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舌界。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓掘譬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呻拌。 傳聞我的和親對象是個殘疾皇子葱轩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容