Go語言基礎(chǔ)模板設(shè)計(jì)模式示例詳解
概述
模板方法模式定義了一個(gè)算法的步驟,并允許子類別為一個(gè)或多個(gè)步驟提供其實(shí)踐方式。讓子類別在不改變算法架構(gòu)的情況下,重新定義算法中的某些步驟
確定了步驟的執(zhí)行順序,單某些步驟因環(huán)境或人等因素具體實(shí)現(xiàn)是未知的
模板模式生活案例
請(qǐng)客吃飯【點(diǎn)菜->吃東西->結(jié)賬】,每個(gè)人點(diǎn)菜不一樣,吃東西不一樣,結(jié)賬也不一樣從某地到某地【起點(diǎn)->出行方式->終點(diǎn)】起點(diǎn)和終點(diǎn)不一一樣,但是每個(gè)人出行方式是不一樣的
Go沒有封裝、繼承、多態(tài)這些概念,但同樣通過別的方式可以實(shí)現(xiàn)這些特性
- 封裝:通過方法實(shí)現(xiàn)
- 繼承:通過匿名字段實(shí)現(xiàn)
- 多態(tài):通過接口實(shí)現(xiàn)
策略模式涉及到兩個(gè)角色
編號(hào) | 角色 | 描述 |
---|---|---|
1 | 抽象父類(AbstractClass) | 實(shí)現(xiàn)了模板方法,定義了算法的骨架 |
2 | 具體類(ConcreteClass) | 實(shí)現(xiàn)抽象類中的抽象方法,即不同的對(duì)象的具體實(shí)現(xiàn)細(xì)節(jié) |
UML
總結(jié)
優(yōu)點(diǎn):
- 封裝不變部分,擴(kuò)展可變部分。
- 提取公共代碼,便于維護(hù)。
- 行為由父類控制,子類實(shí)現(xiàn)。
缺點(diǎn):
每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類來實(shí)現(xiàn),導(dǎo)致類的個(gè)數(shù)增加,使得系統(tǒng)更加龐大
使用場(chǎng)景:
有多個(gè)子類共有的方法,且邏輯相同
重要的、復(fù)雜的方法,可以考慮作為模板方法
示例
package main import "fmt" /*出行方式接口*/ type Itravel interface { Starting() //起點(diǎn) Travel()//出行方式 End()//終點(diǎn) } //定義父類 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 //匿名字段實(shí)現(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", "坐飛機(jī)") } 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è)計(jì)模式示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語言模板設(shè)計(jì)模式的資料請(qǐng)關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。