Go语言通过接口和组合实现模板方法模式,定义算法骨架并延迟步骤实现。示例中Pipeline结构体封装加载、保存等固定流程,DataProcessor接口允许不同验证与处理逻辑注入,UserProcessor和OrderProcessor分别实现特定行为,执行时根据具体处理器完成差异化处理,从而达到流程复用与扩展目的,符合开闭原则且避免代码重复。

在 Go 语言中,虽然没有像 Java 那样的继承机制来直接实现模板方法模式(Template Method Pattern),但可以通过接口和组合的方式模拟这一行为。模板方法模式属于行为型设计模式,它定义了一个算法的骨架,而将一些步骤延迟到子类中实现。
模板方法的核心思想
模板方法模式适用于多个结构相似的类执行流程一致,但某些具体步骤不同时。通过把共用的流程封装在一个“模板函数”中,让不同的实现去覆盖特定环节。
Go 中的实现方式:
使用接口定义可变步骤结构体包含公共流程(即模板方法)不同实现注入接口实现差异逻辑
示例:构建一个数据处理流程
假设我们有一套通用的数据处理流程:加载数据 → 验证数据 → 处理数据 → 保存结果。其中“加载”和“保存”是固定的,而“验证”和“处理”因场景不同而变化。
立即学习“go语言免费学习笔记(深入)”;
定义接口描述可变行为:
type DataProcessor interface { Validate(data string) bool Process(data string) string}
定义模板结构体,包含固定流程:
type Pipeline struct { processor DataProcessor}func NewPipeline(p DataProcessor) *Pipeline {return &Pipeline{processor: p}}
// TemplateMethod 是模板方法,定义整个流程func (p *Pipeline) Execute(input string) string {// Step 1: 加载数据(固定)data := "Loaded: " + input
// Step 2: 验证(由实现决定)if !p.processor.Validate(data) { return "Validation failed"}// Step 3: 处理(由实现决定)result := p.processor.Process(data)// Step 4: 保存(固定)return "Saved: " + result
}
实现两个不同的处理器:
// 用户数据处理器type UserProcessor struct{}func (u *UserProcessor) Validate(data string) bool {return len(data) > 10}
func (u *UserProcessor) Process(data string) string {return "[User] " + data + " [Processed]"}
// 订单数据处理器type OrderProcessor struct{}
func (o *OrderProcessor) Validate(data string) bool {return contains(data, "Order")}
func (o *OrderProcessor) Process(data string) string {return "[Order] " + data + " [Handled]"}
func contains(s, substr string) bool {return len(s) > len(substr) && (s[len(s)-len(substr):] == substr)}
使用示例:
func main() { userPipe := NewPipeline(&UserProcessor{}) orderPipe := NewPipeline(&OrderProcessor{})result1 := userPipe.Execute("user_data_123")result2 := orderPipe.Execute("Order_456")fmt.Println(result1) // Saved: [User] Loaded: user_data_123 [Processed]fmt.Println(result2) // Saved: [Order] Loaded: Order_456 [Handled]
}
关键点说明
解耦流程与实现:模板方法把不变的部分固化,变化的部分通过接口注入,便于扩展新类型而不修改原有代码。
符合开闭原则:对扩展开放(新增处理器),对修改关闭(模板方法不动)。
避免重复代码:多个处理器共享同一执行流程,减少冗余。
基本上就这些。Go 虽无继承,但用接口+组合完全可以优雅地实现模板方法模式,特别适合配置化流程控制场景。
以上就是Golang TemplateMethod流程控制模板方法示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1410618.html
微信扫一扫
支付宝扫一扫