2023-08-24|閱讀時間 ‧ 約 3 分鐘

Golang - Design Pattern #7: 模板方法模式 (Template Method)

raw-image


模板方法模式:就像做麵包的食譜!


大家好!今天我們來談談模板方法模式(Template Method)。它有點像給你一份麵包的食譜,告訴你該怎麼混合、發酵和烘焙,但是具體的材料和調味料,就交給你自己去選擇和調整。它定義了一個演算法的步驟,但留下了一些具體的實現讓子類去完成。


讓我們深入探討一下

模板方法模式的核心是一個方法,這個方法將算法定義為一系列的步驟,其中一些步驟是由子類來具體實現的。這樣,你可以改變算法的具體實現,而不改變算法結構。


Go 的時間!

想像一下,你正在設計一個工作流程系統,每個工作流程都有 開始執行結束 的步驟。但每個工作流程的 執行 細節都不同:

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()
}

運行這個程式,你會看到每個工作流程都會 開始執行結束,但 執行 的部分是根據具體的工作流程來定義的。


總結

模板方法模式就像我們日常生活中的食譜,提供了一個基本的指南,但留下一些空間讓我們可以進行調整。它確保了一致性,同時也提供了靈活性。下次當你需要一個有結構但又具有某種程度的自定義空間的算法時,不妨試試這個模式!

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.