模板方法模式:就像做麵包的食譜!
大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。
模板方法模式的核心是一個方法,這個方法將算法定義為一系列的步驟,其中一些步驟是由子類來具體實現的。這樣,你可以改變算法的具體實現,而不改變算法結構。
想像一下,你正在設計一個工作流程系統,每個工作流程都有 開始
、執行
和 結束
的步驟。但每個工作流程的 執行
細節都不同:
package main
import "fmt"
// 定義工作流程的接口
type Workflow interface {
Start()
Execute()
End()
Run()
}
// 模板方法實現在基礎流程中
type BaseWorkflow struct{}
func (b *BaseWorkflow) Start() {
fmt.Println("工作流程開始")
}
func (b *BaseWorkflow) End() {
fmt.Println("工作流程結束")
}
func (b *BaseWorkflow) Run() {
b.Start()
b.Execute()
b.End()
}
// 第一個具體的工作流程
type ReportWorkflow struct {
BaseWorkflow
}
func (r *ReportWorkflow) Execute() {
fmt.Println("執行報告生成流程")
}
// 第二個具體的工作流程
type AuditWorkflow struct {
BaseWorkflow
}
func (a *AuditWorkflow) Execute() {
fmt.Println("執行審核流程")
}
func main() {
report := &ReportWorkflow{}
report.Run()
audit := &AuditWorkflow{}
audit.Run()
}
運行這個程式,你會看到每個工作流程都會 開始
、執行
和 結束
,但 執行
的部分是根據具體的工作流程來定義的。
模板方法模式就像我們日常生活中的食譜,提供了一個基本的指南,但留下一些空間讓我們可以進行調整。它確保了一致性,同時也提供了靈活性。下次當你需要一個有結構但又具有某種程度的自定義空間的算法時,不妨試試這個模式!