【设计模式】13、template 模板模式

文章目录

  • 十三、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 模板模式. 可以让父类定义整套流程, 子类实现各具体步骤. golang 中可通过 组合 interface 实现继承, 详见例子.

例如, 如果要开发一个数据挖掘程序, 支持输入 word, csv, pdf. 他们其实是相同的流程(如打开文件, 读取数据, 转换数据, 输出数据).

因为每种类别的流程相同, 所以每种类别的实现有很多重复代码.

为了消除这些重复代码, 可以定义基类, 实现通用的逻辑, 如果有个性化的逻辑再覆盖.

源码详见:godp/13template at master · datager/godp · GitHub

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 _31ppl

import (
	"fmt"
	"testing"
)

/*
=== RUN   TestLLMPipeline
llmPipeline 开始检测
llmPipeline 开始分类
llmPipeline 无需分割

ocrPipeline 开始检测
ocrPipeline 开始分类
ocrPipeline 需要分割
ocrPipeline 开始分割
--- PASS: TestLLMPipeline (0.00s)
PASS
*/
func TestLLMPipeline(t *testing.T) {
	e := &aiEngine{ppl: &llmPipeline{}}
	e.runPipeline()

	fmt.Println()
	e = &aiEngine{ppl: &ocrPipeline{}}
	e.runPipeline()
}

13.1.3 ppl.go

package _31ppl

// imagePipeline 图像处理流程
type imagePipeline interface {
	// 检测
	detect()
	// 分类
	classification()
	// 是否需要分割, 可影响父类的流程. 将它留给子类实现, 使子类的具体实现可影响父类的流程
	needSegmentation() bool
	// 分割
	segmentation()
}

type aiEngine struct {
	ppl imagePipeline
}

// go 通过组合, 对 interface 封装了一层, 封装的是 interface 的整个流程
func (e *aiEngine) runPipeline() {
	e.ppl.detect()
	e.ppl.classification()
	if e.ppl.needSegmentation() { // 父类的流程可能会变化, 取决于具体子类的实现
		e.ppl.segmentation()
	}
}

13.1.4 llm_ppl.go

package _31ppl

import "fmt"

type llmPipeline struct{}

func (ppl *llmPipeline) detect() {
	fmt.Println("llmPipeline 开始检测")
}

func (ppl *llmPipeline) classification() {
	fmt.Println("llmPipeline 开始分类")
}

func (ppl *llmPipeline) needSegmentation() bool {
	fmt.Println("llmPipeline 无需分割")
	return false
}

func (ppl *llmPipeline) segmentation() {
	panic("llmPipeline 无需分割, 流程错误!!!")
}

13.1.5 ocr_ppl.go

package _31ppl

import "fmt"

type ocrPipeline struct{}

func (ppl *ocrPipeline) detect() {
	fmt.Println("ocrPipeline 开始检测")
}

func (ppl *ocrPipeline) classification() {
	fmt.Println("ocrPipeline 开始分类")
}

func (ppl *ocrPipeline) needSegmentation() bool {
	fmt.Println("ocrPipeline 需要分割")
	return true
}

func (ppl *ocrPipeline) segmentation() {
	fmt.Println("ocrPipeline 开始分割")
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/591965.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PR2019软件下载教程

打开下载网址:rjctx.com 选择Premiere: 选择PR2019,并点击: 拉到最后,选择百度网盘下载: 下载到本地。 二,软件安装 解压缩后,双击set_up 选择位置后,进行安装&…

场景文本检测识别学习 day08(无监督的Loss Function、代理任务、特征金字塔)

无监督的Loss Function(无监督的目标函数) 根据有无标签,可以将模型的学习方法分为:无监督、有监督两种。而自监督是无监督的一种无监督的目标函数可以分为以下几种: 生成式网络的做法,衡量模型的输出和固…

Python爬虫-BeautifulSoup解析

1.简介 BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 库。它提供了一种灵活且方便的方式来导航、搜索和修改树结构或标记文档。这个库非常适合网页抓取和数据提取任务,因为它允许你以非常直观的方式查询和操作文档内容。 2.安装 Beautiful Soup 终端输…

【与 Apollo 共创生态:展望自动驾驶全新未来】

1、引言 历经七年的不懈追求与创新,Apollo开放平台已陆续推出了13个版本,汇聚了来自全球170多个国家与地区的16万名开发者及220多家合作伙伴。随着Apollo开放平台的不断创新与发展,Apollo在2024年4月19日迎来了Apollo开放平台的七周年大会&a…

golang for经典练习 金字塔打印 示例 支持控制台输入要打印的层数

go语言中最经典的for练习程序 金字塔打印 &#xff0c;这也是其他语言中学习循环和条件算法最为经典的联系题。 其核心算法是如何控制内层循环变量j 每行打印的*号数量 j<i*2-1 和空格数量 j1 || j i*2-1 golang中实现实心金字塔 Solid Pyramid和空心金字塔 Hollow Pyram…

ruoyi漏洞总结

若依识别 黑若依 :icon hash"-1231872293 绿若依 :icon hash"706913071” body" 请通过前端地址访 " body" 认证失败&#xff0c;无法访问系统资源 " 如果页面访问显示不正常&#xff0c;可添加默认访问路径尝试是否显示正常 /login?redi…

20232937文兆宇 2023-2024-2 《网络攻防实践》实践八报告

20232937文兆宇 2023-2024-2 《网络攻防实践》实践八报告 1.实践内容 动手实践任务一 对提供的rada恶意代码样本&#xff0c;进行文件类型识别&#xff0c;脱壳与字符串提取&#xff0c;以获得rada恶意代码的编写作者&#xff0c;具体操作如下&#xff1a; &#xff08;1&am…

Deep Learning Part Eight--Attention 24.5.4

01.在翻译、语音识别等将一个时序数据转换为另一个时序数据的任务中&#xff0c;时序数据之间常常存在对应关系 02.Attention 从数据中学习两个时序数据之间的对应关系 03.Attention 使用向量内积&#xff08;方 法之一&#xff09;计算向量之间的相似度&#xff0c;并输出这个…

【C++题解】1658. 游乐设施

问题&#xff1a;1658. 游乐设施 类型&#xff1a;分支结构 题目描述&#xff1a; 游乐场引进了一个新的游乐设施&#xff0c;可以两人一组开动该设施&#xff0c;但设施设计上有一个缺陷&#xff0c;必须一个人的体重在 60 公斤以上&#xff08;包含 60 公斤&#xff09;&am…

CST保存项目时失败?如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

AI智能名片商城小程序构建企业级私域的IMC模型:IP、MarTech与Content的深度融合

在数字化营销的新时代&#xff0c;为企业定制开发的AI智能名片B2B2C商城小程序&#xff0c;结合我们丰富的私域运营实践&#xff0c;我们深刻领悟到构建企业级私域的三大核心要素&#xff1a;IP&#xff08;企业人设&#xff09;、MarTech&#xff08;营销技术&#xff09;和Co…

飞机起飞降落

第一版&#xff1a;飞机起飞降落脚本 最大速度是1200&#xff0c;螺旋桨速度到1000的时候飞机会上升&#xff0c;到850的时候会下降&#xff0c; 有上升状态&#xff0c;平飞状态和悬浮状态&#xff0c;三个状态按e都可以使螺旋桨减速然后下降 但是是匀速下降&#xff0c;并且…

对命令模式的理解

目录 一、场景1、文本编辑器并不是一个好的例子&#xff0c;设备控制器才是2、设备控制器的demo 二、不用命令模式1、代码2、问题 三、使用命令模式1、代码2、当需求变化时2.1 新增代码2.2 优点 四、进一步思考1、省略对Command的建模可以吗&#xff1f;2、命令模式的价值 一、…

wpf转换器

WPF&#xff08;Windows Presentation Foundation&#xff09;中的转换器主要是指IValueConverter接口的实现&#xff0c;它用于在数据绑定过程中转换源数据和目标数据的类型或表示形式。这种机制使得开发者能够灵活地处理数据&#xff0c;特别是在用户界面&#xff08;UI&…

知识图谱需求

文章目录 公共安全数字经济金融科技资源优化科学研究制造业转型公共健康人文发展 公共安全 公共安全领域信息化以现代通信、网络、数据库技术为基础&#xff0c;将所研究对象各要素汇总至数据库&#xff0c;并针对各个业务领域进行定制化开发&#xff0c;以满足公共安全实战需求…

吴恩达机器学习笔记 三十七 电影推荐系统 使用特征 成本函数 协同过滤算法

以电影评分系统为例&#xff0c;令 r(i, j) 来表示用户 j 已经对电影 i 评分&#xff0c; y&#xff08;i, j&#xff09;表示评分具体是多少。 假如每部电影有自己的特征&#xff0c;那么用户 j 对电影 i 的评分预测为 w(j) * x(i) b(j) r(i, j) &#xff1a;一个用户 j 是否…

P9422 [蓝桥杯 2023 国 B] 合并数列

P9422 [蓝桥杯 2023 国 B] 合并数列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 用队列即可 当两个队列队首&#xff1a;a b &#xff0c;弹出 当a < b&#xff0c;把a加给其后一个元素&#xff0c;弹出a 当b < a&#xff0c;把b加给其后一个元素&#xff0c;弹出…

BUUCTF---misc---菜刀666

1、下载附件&#xff0c;在wireshark中分析 2、题目说是菜刀&#xff0c;联想到http协议的post方法 3、使用命令过滤 http.request.methodPOST 4、打开数据包&#xff0c;发现有个不一样 这里面有一大串的数据包 5、追踪http数据流&#xff0c;发现z2后面是一个jpg文件的文件…

计算机——磁盘

磁盘介绍 磁盘&#xff08;Disk&#xff09;是计算机存储设备的一种&#xff0c;用于持久存储和读取数据。它以圆盘状的物理结构为基础&#xff0c;通过磁性材料在盘片上制造磁道和磁点&#xff0c;利用磁头来读写数据。 磁盘分类 磁盘的常见类型包括硬盘驱动器&#xff08;…

数据库基础--MySQL多表查询之联表查询

联表查询 定义&#xff1a;多张表联合在一起查询&#xff0c;例如学生信息与学生班级表、部门与员工表 创建两张表&#xff0c;主表与从表 CREATE TABLE TestMain(id INT Not NULL AUTO_INCREMENT,nameVARCHAR(10),introduction VARCHAR(255),PRIMARY KEY(id) ); CREATE TAB…
最新文章