意圖:
定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
關鍵程式碼:
通用步驟在抽象類中實現,變化的步驟在具體的子類中實現
應用例項:
- 做飯,開啟煤氣,開火,(做飯), 關火,關閉煤氣。除了做飯其他步驟都是相同的,抽到抽象類中實現
- spring 中對 Hibernate 的支援,將一些已經定好的方法封裝起來,比如開啟事務、獲取 Session、關閉 Session
Go實現模板方法
package template
import "fmt"
type Cooker interface {
open()
fire()
cooke()
outfire()
close()
}
// 類似於一個抽象類
type CookMenu struct {
}
func (CookMenu) open() {
fmt.Println("開啟開關")
}
func (CookMenu) fire() {
fmt.Println("開火")
}
// 做菜,交給具體的子類實現
func (CookMenu) cooke() {
}
func (CookMenu) outfire() {
fmt.Println("關火")
}
func (CookMenu) close() {
fmt.Println("關閉開關")
}
// 封裝具體步驟
func doCook(cook Cooker) {
cook.open()
cook.fire()
cook.cooke()
cook.outfire()
cook.close()
}
type XiHongShi struct {
CookMenu
}
func (*XiHongShi) cooke() {
fmt.Println("做蕃茄")
}
type ChaoJiDan struct {
CookMenu
}
func (ChaoJiDan) cooke() {
fmt.Println("做炒雞蛋")
}
測試用例
package template
import "testing"
func TestTemplate(t *testing.T) {
// 做蕃茄
xihongshi := &XiHongShi{}
doCook(xihongshi)
// 做炒雞蛋
chaojidan := &ChaoJiDan{}
doCook(chaojidan)
}
具體程式碼
更詳細的程式碼可參考:https://github.com/pibigstar/go-demo 裡面包含了 Go 常用的設計模式、Go 面試易錯點、簡單的小專案(區塊鏈,爬蟲等)、還有各種第三方的對接(redis、sms、nsq、elsticsearch、alipay、oss...),如果對你有所幫助,請給個 Star
,你的支援,是我最大的動力!
本作品採用《CC 協議》,轉載必須註明作者和本文連結