Skip to content
← 返回设计模式列表
设计意图与对象责任

模板方法 ​

固定流程,允许替换其中的步骤。

行为型

说明 ​

Go 通常用组合和函数参数表达步骤,而不是依赖继承。

分析 ​

Process 固定“校验后保存”的顺序,validate 与 save 则由调用方提供。Go 没有类继承体系,函数参数或接口组合更自然地表达可替换步骤。

模板拥有顺序,步骤提供实现:校验失败立即返回 false,保存函数不会被调用。传入的函数必须非 nil。示例 save 没有返回错误,因此 true 只表示校验通过且 save 已返回,不证明真实存储成功;需要持久化时应把保存失败纳入返回契约。

查看图表代码

适用前提与边界 ​

流程的固定部分必须稳定,否则频繁增加钩子会让模板难以理解。 交互流程很短且稳定时,直接调用通常更容易理解。

示例输入与调用 ​

go
ok := Process("report", func(s string) bool { return s != "" }, func(s string) { fmt.Println("saved:", s) })
	fmt.Println(ok)

运行输出 ​

text
saved: report
true

完整 Go 示例 ​

go
package main

import "fmt"

func Process(input string, validate func(string) bool, save func(string)) bool {
	if !validate(input) {
		return false
	}
	save(input)
	return true
}

func main() {
	ok := Process("report", func(s string) bool { return s != "" }, func(s string) { fmt.Println("saved:", s) })
	fmt.Println(ok)
}

继续阅读