Go語言基礎(chǔ)模板設(shè)計模式示例詳解
概述
模板方法模式定義了一個算法的步驟,并允許子類別為一個或多個步驟提供其實踐方式。讓子類別在不改變算法架構(gòu)的情況下,重新定義算法中的某些步驟
確定了步驟的執(zhí)行順序,單某些步驟因環(huán)境或人等因素具體實現(xiàn)是未知的
模板模式生活案例
請客吃飯【點菜->吃東西->結(jié)賬】,每個人點菜不一樣,吃東西不一樣,結(jié)賬也不一樣從某地到某地【起點->出行方式->終點】起點和終點不一一樣,但是每個人出行方式是不一樣的
Go沒有封裝、繼承、多態(tài)這些概念,但同樣通過別的方式可以實現(xiàn)這些特性
- 封裝:通過方法實現(xiàn)
- 繼承:通過匿名字段實現(xiàn)
- 多態(tài):通過接口實現(xiàn)
策略模式涉及到兩個角色
編號 | 角色 | 描述 |
---|---|---|
1 | 抽象父類(AbstractClass) | 實現(xiàn)了模板方法,定義了算法的骨架 |
2 | 具體類(ConcreteClass) | 實現(xiàn)抽象類中的抽象方法,即不同的對象的具體實現(xiàn)細(xì)節(jié) |
UML
總結(jié)
優(yōu)點:
- 封裝不變部分,擴(kuò)展可變部分。
- 提取公共代碼,便于維護(hù)。
- 行為由父類控制,子類實現(xiàn)。
缺點:
每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大
使用場景:
有多個子類共有的方法,且邏輯相同
重要的、復(fù)雜的方法,可以考慮作為模板方法
示例
package main import "fmt" /*出行方式接口*/ type Itravel interface { Starting() //起點 Travel() //出行方式 End() //終點 } //定義父類 type Persion struct { Name string //姓名 Itravel Itravel //出行方式接口 } func (persion *Persion) SetName(name string) { persion.Name = name } func (persion Persion) Starting() { persion.Itravel.Starting() } func (persion Persion) Travel() { persion.Itravel.Travel() } func (persion Persion) End() { persion.Itravel.End() } //算法骨架 func (persion Persion) Start() { if persion.Itravel == nil { fmt.Println("Itravel is nil") return } fmt.Printf("%s", persion.Name) persion.Starting() persion.Travel() persion.End() fmt.Println("\n") } //具體類:張三 type ZhangSan struct { Persion //匿名字段實現(xiàn)繼承 } func NewZhangSan() *ZhangSan { c := new(ZhangSan) c.Persion = Persion{Itravel: c} return c } func (_ ZhangSan) Starting() { fmt.Printf("從%s出發(fā)", "北京") } func (_ ZhangSan) Travel() { fmt.Printf(" %s", "火車") } func (_ ZhangSan) End() { fmt.Printf(" %s", "到達(dá)上海") } //具體類:李四 type LiSi struct { Persion } func (_ LiSi) Starting() { fmt.Printf("從%s出發(fā)", "廣州") } func (_ LiSi) Travel() { fmt.Printf(" %s", "坐飛機") } func (_ LiSi) End() { fmt.Printf(" %s", "到達(dá)重慶") } func main() { //張三 zhangsan := NewZhangSan() zhangsan.SetName("張三") zhangsan.Start() persion := &Persion{} persion.SetName("張三") persion.Itravel = ZhangSan{} persion.Start() //李四 persion.SetName("李四") persion.Itravel = &LiSi{} persion.Start() lisi := LiSi{} lisi.Itravel = lisi lisi.SetName("李四") lisi.Start() }
以上就是Go語言基礎(chǔ)模板設(shè)計模式示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語言模板設(shè)計模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Golang?container/list實現(xiàn)LRU緩存
Least?Recently?Used?(LRU)?,即逐出最早使用的緩存,這篇文章主要為大家介紹了如何基于Golang?container/list實現(xiàn)LRU緩存,感興趣的可以了解下2023-08-08Golang中使用Date進(jìn)行日期格式化(沿用Java風(fēng)格)
這篇文章主要介紹了Golang中使用Date進(jìn)行日期格式化,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Golang 字符串與字節(jié)數(shù)組互轉(zhuǎn)的實現(xiàn)
在Go語言中,我們經(jīng)常在字符串和切片之間進(jìn)行轉(zhuǎn)換,本文就詳細(xì)的介紹一下Golang 字符串與字節(jié)數(shù)組互轉(zhuǎn)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02深入學(xué)習(xí)Golang并發(fā)編程必備利器之sync.Cond類型
Go?語言的?sync?包提供了一系列同步原語,其中?sync.Cond?就是其中之一。本文將深入探討?sync.Cond?的實現(xiàn)原理和使用方法,幫助大家更好地理解和應(yīng)用?sync.Cond,需要的可以參考一下2023-05-05Go語言類型內(nèi)嵌和結(jié)構(gòu)體內(nèi)嵌的具體使用
本文主要介紹了Go語言類型內(nèi)嵌和結(jié)構(gòu)體內(nèi)嵌的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Sublime Text3安裝Go語言相關(guān)插件gosublime時搜不到gosublime的解決方法
本文主要介紹了Sublime Text3安裝Go語言相關(guān)插件gosublime時搜不到gosublime的解決方法,具有一定的參考價值,感興趣的可以了解一下2022-01-01