文章目录
- 十三、template 模板模式
- 13.1 ppl
- 13.1.1 目录层级
- 13.1.2 ppl_test.go
- 13.1.3 ppl.go
- 13.1.4 llm_ppl.go
- 13.1.5 ocr_ppl.go
十三、template 模板模式
https://refactoringguru.cn/design-patterns/template-method
如果是一套标准流程, 但有多种实现, 可以用 template 模板模式.
例如, 如果要开发一个数据挖掘程序, 支持输入 word, csv, pdf. 他们其实是相同的流程(如打开文件, 读取数据, 转换数据, 输出数据).
因为每种类别的流程相同, 所以每种类别的实现有很多重复代码.
为了消除这些重复代码, 可以定义基类, 实现通用的逻辑, 如果有个性化的逻辑再覆盖.
13.1 ppl
https://refactoringguru.cn/design-patterns/template-method/go/example
go 虽然没有继承, 但可通过 interface 和 组合实现. 框架如下:
type iTemplate interface { step1() step2()} // 外部使用的基类
type wrapper struct { template iTemplate} // 基类的方法: 串联整个流程
func (w *wrapper) run() { w.template.step1() w.template.step2()}
然后有如下具体实现:
type impl1 struct {}
func (i *impl1) step1() {}
func (i *impl1) step2() {} type impl2 struct {}
func (i *impl2) step1() {}
func (i *impl2) step2() {}
使用:
// 第一种实现
w := &wrapper{template: &impl1{}}
w.run() // 第二种实现
w := &wrapper{template: &impl2{}}
w.run()
13.1.1 目录层级
├── llm_ppl.go
├── ocr_ppl.go
├── ppl.go
├── ppl_test.go
└── readme.md
13.1.2 ppl_test.go
package _31pplimport "testing"func TestLLMPipeline(t *testing.T) {e := &aiEngine{ppl: &llmPipeline{}}e.runPipeline()e = &aiEngine{ppl: &ocrPipeline{}}e.runPipeline()
}
13.1.3 ppl.go
package _31ppl// imagePipeline 图像处理流程
type imagePipeline interface {// 检测detect()// 分类classification()
}type aiEngine struct {ppl imagePipeline
}func (e *aiEngine) runPipeline() {e.ppl.detect()e.ppl.classification()
}
13.1.4 llm_ppl.go
package _31pplimport "fmt"type llmPipeline struct{}func (ppl *llmPipeline) detect() {fmt.Println("llmPipeline detect")
}func (ppl *llmPipeline) classification() {fmt.Println("llmPipeline classification")
}
13.1.5 ocr_ppl.go
package _31pplimport "fmt"type ocrPipeline struct{}func (ppl *ocrPipeline) detect() {fmt.Println("ocrPipeline detect")
}func (ppl *ocrPipeline) classification() {fmt.Println("ocrPipeline classification")
}