【最佳实践】Go 模板模式

设计思路

模板模式的一个经典业务场景是数据处理管道,比如处理来自不同来源的数据,转换它们,然后存储到数据库中。在这种情况下,数据处理的整体流程是固定的,但每个步骤的具体实现可以根据数据源的不同而有所变化。

场景描述

我们将实现一个简单的数据处理管道,负责从数据源中提取数据,进行转换,然后保存到数据库。不同的数据源可能需要不同的提取和转换逻辑,但保存步骤是相同的。

实现示例

下面是一个使用模板模式实现的 Go 语言示例,展示了如何处理来自不同数据源的数据:

package main

import "fmt"

// DataPipeline 定义了数据处理的步骤接口
type DataPipeline interface {
	Extract() string
	Transform(data string) string
	Load(data string)
}

// Template 定义了数据处理的骨架
type Template struct {
	pipeline DataPipeline
}

// Execute 运行数据处理的骨架
func (t *Template) Execute() {
	data := t.pipeline.Extract()
	transformedData := t.pipeline.Transform(data)
	t.pipeline.Load(transformedData)
}

// APIPipeline 是从 API 提取数据的具体实现
type APIPipeline struct{}

func (a *APIPipeline) Extract() string {
	fmt.Println("Extracting data from API...")
	return "API data"
}

func (a *APIPipeline) Transform(data string) string {
	fmt.Println("Transforming API data...")
	return data + " [Transformed by API]"
}

func (a *APIPipeline) Load(data string) {
	fmt.Println("Loading data to database:", data)
}

// FilePipeline 是从文件提取数据的具体实现
type FilePipeline struct{}

func (f *FilePipeline) Extract() string {
	fmt.Println("Extracting data from file...")
	return "File data"
}

func (f *FilePipeline) Transform(data string) string {
	fmt.Println("Transforming file data...")
	return data + " [Transformed by File]"
}

func (f *FilePipeline) Load(data string) {
	fmt.Println("Loading data to database:", data)
}

func main() {
	// 使用 APIPipeline
	apiPipeline := &APIPipeline{}
	apiTemplate := &Template{pipeline: apiPipeline}
	fmt.Println("Processing API data:")
	apiTemplate.Execute()

	// 使用 FilePipeline
	filePipeline := &FilePipeline{}
	fileTemplate := &Template{pipeline: filePipeline}
	fmt.Println("\nProcessing File data:")
	fileTemplate.Execute()
}

代码解释

  • DataPipeline 接口:定义了数据处理的三个步骤 ExtractTransformLoad。具体的数据管道实现需要提供这些方法的具体实现。

  • Template 结构体:包含一个 DataPipeline 接口,定义了 Execute 方法,表示数据处理流程的骨架。它依次调用数据提取、转换和加载步骤。

  • APIPipeline 和 FilePipeline:这两个结构体实现了 DataPipeline 接口,提供了从 API 和文件提取数据的具体实现。每个结构体根据数据源不同实现了不同的提取和转换逻辑。

  • main 函数:展示了如何使用模板模式来处理不同来源的数据。首先创建 Template 实例,并将具体的数据管道实现传递给它,然后调用 Execute 方法运行数据处理流程。

这种实现方式展示了模板模式在数据处理管道中的应用,通过将处理流程固定化并允许子类自定义特定步骤,达到了代码复用和灵活性的良好结合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值