设计思路
模板模式的一个经典业务场景是数据处理管道,比如处理来自不同来源的数据,转换它们,然后存储到数据库中。在这种情况下,数据处理的整体流程是固定的,但每个步骤的具体实现可以根据数据源的不同而有所变化。
场景描述
我们将实现一个简单的数据处理管道,负责从数据源中提取数据,进行转换,然后保存到数据库。不同的数据源可能需要不同的提取和转换逻辑,但保存步骤是相同的。
实现示例
下面是一个使用模板模式实现的 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 接口:定义了数据处理的三个步骤
Extract
、Transform
和Load
。具体的数据管道实现需要提供这些方法的具体实现。 -
Template 结构体:包含一个
DataPipeline
接口,定义了Execute
方法,表示数据处理流程的骨架。它依次调用数据提取、转换和加载步骤。 -
APIPipeline 和 FilePipeline:这两个结构体实现了
DataPipeline
接口,提供了从 API 和文件提取数据的具体实现。每个结构体根据数据源不同实现了不同的提取和转换逻辑。 -
main 函数:展示了如何使用模板模式来处理不同来源的数据。首先创建
Template
实例,并将具体的数据管道实现传递给它,然后调用Execute
方法运行数据处理流程。
这种实现方式展示了模板模式在数据处理管道中的应用,通过将处理流程固定化并允许子类自定义特定步骤,达到了代码复用和灵活性的良好结合。