Golang TemplateMethod流程控制模板方法示例

17次阅读

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

Golang TemplateMethod流程控制模板方法示例

在 Go 语言中,虽然没有像 Java 那样的继承机制来直接实现模板方法模式(Template Method Pattern),但可以通过接口和组合的方式模拟这一行为。模板方法模式属于行为型设计模式,它定义了一个算法的骨架,而将一些步骤延迟到子类中实现。

模板方法的核心思想

模板方法模式适用于多个结构相似的类执行流程一致,但某些具体步骤不同时。通过把共用的流程封装在一个“模板函数”中,让不同的实现去覆盖特定环节。

Go 中的实现方式:

  • 使用接口定义可变步骤
  • 结构体包含公共流程(即模板方法)
  • 不同实现注入接口实现差异逻辑

示例:构建一个数据处理流程

假设我们有一套通用的数据处理流程:加载数据 → 验证数据 → 处理数据 → 保存结果。其中“加载”和“保存”是固定的,而“验证”和“处理”因场景不同而变化。

立即学习go语言免费学习笔记(深入)”;

定义接口描述可变行为:

<font face="Courier New,Courier,monospace">type DataProcessor interface {     Validate(data string) bool     Process(data string) string }</font>

定义模板结构体,包含固定流程:

<font face="Courier New,Courier,monospace">type Pipeline struct {     processor DataProcessor } <p>func NewPipeline(p DataProcessor) *Pipeline { return &Pipeline{processor: p} }</p><p>// TemplateMethod 是模板方法,定义整个流程 func (p *Pipeline) Execute(input string) string { // Step 1: 加载数据(固定) data := "Loaded: " + input</p><pre class='brush:php;toolbar:false;'>// Step 2: 验证(由实现决定) if !p.processor.Validate(data) {     return "Validation failed" }  // Step 3: 处理(由实现决定) result := p.processor.Process(data)  // Step 4: 保存(固定) return "Saved: " + result

}

Golang TemplateMethod流程控制模板方法示例

AiPPT模板广场

AiPPT模板广场-PPT模板-word文档模板-excel表格模板

Golang TemplateMethod流程控制模板方法示例50

查看详情 Golang TemplateMethod流程控制模板方法示例

实现两个不同的处理器

<font face="Courier New,Courier,monospace">// 用户数据处理器 type UserProcessor struct{} <p>func (u *UserProcessor) Validate(data string) bool { return len(data) > 10 }</p><p>func (u *UserProcessor) Process(data string) string { return "[User] " + data + " [Processed]" }</p><p>// 订单数据处理器 type OrderProcessor struct{}</p><p>func (o *OrderProcessor) Validate(data string) bool { return contains(data, "Order") }</p><p>func (o *OrderProcessor) Process(data string) string { return "[Order] " + data + " [Handled]" }</p><p>func contains(s, substr string) bool { return len(s) > len(substr) && (s[len(s)-len(substr):] == substr) }</font>

使用示例:

<font face="Courier New,Courier,monospace">func main() {     userPipe := NewPipeline(&UserProcessor{})     orderPipe := NewPipeline(&OrderProcessor{}) <pre class='brush:php;toolbar:false;'>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]

}

Golang TemplateMethod流程控制模板方法示例

AiPPT模板广场

AiPPT模板广场-PPT模板-word文档模板-excel表格模板

Golang TemplateMethod流程控制模板方法示例50

查看详情 Golang TemplateMethod流程控制模板方法示例

关键点说明

解耦流程与实现:模板方法把不变的部分固化,变化的部分通过接口注入,便于扩展新类型而不修改原有代码。

符合开闭原则:对扩展开放(新增处理器),对修改关闭(模板方法不动)。

避免重复代码:多个处理器共享同一执行流程,减少冗余。

基本上就这些。Go 虽无继承,但用接口+组合完全可以优雅地实现模板方法模式,特别适合配置化流程控制场景。

java go golang 处理器 go语言 ai Java golang 封装 子类 结构体 继承 接口 Go语言 算法

text=ZqhQzanResources