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

總結
優(yōu)點:
- 封裝不變部分,擴展可變部分。
- 提取公共代碼,便于維護。
- 行為由父類控制,子類實現(xiàn)。
缺點:
每一個不同的實現(xiàn)都需要一個子類來實現(xiàn),導致類的個數增加,使得系統(tǒng)更加龐大
使用場景:
有多個子類共有的方法,且邏輯相同
重要的、復雜的方法,可以考慮作為模板方法
示例
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", "到達上海")
}
//具體類:李四
type LiSi struct {
Persion
}
func (_ LiSi) Starting() {
fmt.Printf("從%s出發(fā)", "廣州")
}
func (_ LiSi) Travel() {
fmt.Printf(" %s", "坐飛機")
}
func (_ LiSi) End() {
fmt.Printf(" %s", "到達重慶")
}
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語言基礎模板設計模式示例詳解的詳細內容,更多關于Go語言模板設計模式的資料請關注腳本之家其它相關文章!
相關文章
基于Golang?container/list實現(xiàn)LRU緩存
Least?Recently?Used?(LRU)?,即逐出最早使用的緩存,這篇文章主要為大家介紹了如何基于Golang?container/list實現(xiàn)LRU緩存,感興趣的可以了解下2023-08-08
Golang中使用Date進行日期格式化(沿用Java風格)
這篇文章主要介紹了Golang中使用Date進行日期格式化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
Golang 字符串與字節(jié)數組互轉的實現(xiàn)
在Go語言中,我們經常在字符串和切片之間進行轉換,本文就詳細的介紹一下Golang 字符串與字節(jié)數組互轉的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
深入學習Golang并發(fā)編程必備利器之sync.Cond類型
Go?語言的?sync?包提供了一系列同步原語,其中?sync.Cond?就是其中之一。本文將深入探討?sync.Cond?的實現(xiàn)原理和使用方法,幫助大家更好地理解和應用?sync.Cond,需要的可以參考一下2023-05-05
Sublime Text3安裝Go語言相關插件gosublime時搜不到gosublime的解決方法
本文主要介紹了Sublime Text3安裝Go語言相關插件gosublime時搜不到gosublime的解決方法,具有一定的參考價值,感興趣的可以了解一下2022-01-01

