首页 > 后端开发 > Golang > 正文

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

P粉602998670
发布: 2025-10-02 18:24:02
原创
971人浏览过
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
登录后复制

}

AiPPT模板广场
AiPPT模板广场

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

AiPPT模板广场 147
查看详情 AiPPT模板广场

实现两个不同的处理器

<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]
登录后复制

}

关键点说明

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

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

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

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

以上就是Golang TemplateMethod流程控制模板方法示例的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号