Go語言基礎(chǔ)模板設(shè)計(jì)模式示例詳解
概述
模板方法模式定義了一個算法的步驟,并允許子類別為一個或多個步驟提供其實(shí)踐方式。讓子類別在不改變算法架構(gòu)的情況下,重新定義算法中的某些步驟
確定了步驟的執(zhí)行順序,單某些步驟因環(huán)境或人等因素具體實(shí)現(xiàn)是未知的
模板模式生活案例
請客吃飯【點(diǎn)菜->吃東西->結(jié)賬】,每個人點(diǎn)菜不一樣,吃東西不一樣,結(jié)賬也不一樣從某地到某地【起點(diǎn)->出行方式->終點(diǎn)】起點(diǎn)和終點(diǎn)不一一樣,但是每個人出行方式是不一樣的
Go沒有封裝、繼承、多態(tài)這些概念,但同樣通過別的方式可以實(shí)現(xiàn)這些特性
- 封裝:通過方法實(shí)現(xiàn)
- 繼承:通過匿名字段實(shí)現(xiàn)
- 多態(tài):通過接口實(shí)現(xiàn)
策略模式涉及到兩個角色
| 編號 | 角色 | 描述 |
|---|---|---|
| 1 | 抽象父類(AbstractClass) | 實(shí)現(xiàn)了模板方法,定義了算法的骨架 |
| 2 | 具體類(ConcreteClass) | 實(shí)現(xiàn)抽象類中的抽象方法,即不同的對象的具體實(shí)現(xiàn)細(xì)節(jié) |
UML

總結(jié)
優(yōu)點(diǎn):
- 封裝不變部分,擴(kuò)展可變部分。
- 提取公共代碼,便于維護(hù)。
- 行為由父類控制,子類實(shí)現(xiàn)。
缺點(diǎn):
每一個不同的實(shí)現(xiàn)都需要一個子類來實(shí)現(xiàn),導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大
使用場景:
有多個子類共有的方法,且邏輯相同
重要的、復(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ì)模式的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式
這篇文章主要介紹了go類型轉(zhuǎn)換及與C的類型轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
在 Golang 中實(shí)現(xiàn)一個簡單的Http中間件過程詳解
本文在go web中簡單的實(shí)現(xiàn)了中間件的機(jī)制,這樣帶來的好處也是顯而易見的,當(dāng)然社區(qū)也有一些成熟的 middleware 組件,包括 Gin 一些Web框架中也包含了 middleware 相關(guān)的功能,具體內(nèi)容詳情跟隨小編一起看看吧2021-07-07
GO?CountMinSketch計(jì)數(shù)器(布隆過濾器思想的近似計(jì)數(shù)器)
這篇文章主要介紹了GO?CountMinSketch計(jì)數(shù)器(布隆過濾器思想的近似計(jì)數(shù)器),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-09-09

