当前位置: 首页 > news >正文

模板方法模式详解

模板方法模式详解及真实场景解决方案

推荐学习完策略模式和模板方法模式看这个案例:
策略与模板方法模式组合详解

模式定义

模板方法模式是一种行为设计模式,在父类中定义算法的骨架,允许子类在不改变算法结构的情况下重写特定步骤。核心思想是通过固定流程框架与可变步骤实现的分离,实现代码复用和扩展控制。

真实场景案例:电商订单处理系统

需求背景:
需要处理多种订单类型(普通订单、团购订单、秒杀订单)
所有订单都遵循标准流程:验证 -> 支付 -> 扣库存 -> 通知
不同订单类型的验证规则、支付方式、通知渠道存在差异

痛点问题:

流程步骤重复定义
新增订单类型时需要重复编写流程代码
修改通用流程时需要修改所有子类
步骤间存在条件判断和参数传递问题

解决方案代码实现

import java.util.HashMap;
import java.util.Map;// 上下文对象(解决参数传递问题)
class OrderContext {private final Map<String, Object> data = new HashMap<>();public OrderContext put(String key, Object value) {data.put(key, value);return this;}public <T> T get(String key) {return (T) data.get(key);}
}// 抽象模板类
abstract class OrderProcessor {// 模板方法(final防止子类覆盖)public final void processOrder(OrderContext context) {if (!validate(context)) {rollback(context);return;}beforePayment(context);boolean paymentResult = processPayment(context);if (paymentResult) {deductInventory(context);sendNotification(context);afterSuccess(context);} else {handlePaymentFailure(context);}}// 必须实现的步骤protected abstract boolean validate(OrderContext context);protected abstract boolean processPayment(OrderContext context);// 可选步骤(默认实现)protected void beforePayment(OrderContext context) {// 空实现}protected void deductInventory(OrderContext context) {System.out.println("默认库存扣减逻辑");}protected void sendNotification(OrderContext context) {System.out.println("发送短信通知用户");}// 钩子方法(控制流程走向)protected boolean needSpecialNotification() {return false;}// 公共方法protected void rollback(OrderContext context) {System.out.println("执行订单回滚操作");}protected void handlePaymentFailure(OrderContext context) {System.out.println("处理支付失败流程");}protected void afterSuccess(OrderContext context) {System.out.println("订单后续处理");}
}// 具体实现:团购订单处理
class GroupBuyOrderProcessor extends OrderProcessor {@Overrideprotected boolean validate(OrderContext context) {Integer groupSize = context.get("groupSize");System.out.println("验证团购人数:" + groupSize);return groupSize != null && groupSize >= 5;}@Overrideprotected boolean processPayment(OrderContext context) {System.out.println("执行团购优惠价支付");return true;}@Overrideprotected void deductInventory(OrderContext context) {System.out.println("按团购规则扣减库存");}@Overrideprotected boolean needSpecialNotification() {return true;}@Overrideprotected void sendNotification(OrderContext context) {if (needSpecialNotification()) {System.out.println("发送团购专属通知");} else {super.sendNotification(context);}}
}// 具体实现:秒杀订单处理
class FlashSaleOrderProcessor extends OrderProcessor {@Overrideprotected boolean validate(OrderContext context) {System.out.println("验证秒杀资格和库存");return true;}@Overrideprotected boolean processPayment(OrderContext context) {System.out.println("执行秒杀价支付(10秒内完成)");return true;}@Overrideprotected void beforePayment(OrderContext context) {System.out.println("锁定秒杀库存30秒");}
}// 使用示例
public class TemplateMethodPatternExample {public static void main(String[] args) {// 处理团购订单OrderContext groupBuyContext = new OrderContext().put("groupSize", 8).put("productId", 1001);new GroupBuyOrderProcessor().processOrder(groupBuyContext);System.out.println("\n===============\n");// 处理秒杀订单OrderContext flashSaleContext = new OrderContext().put("userId", "u123456").put("flashSaleId", "fs2023");new FlashSaleOrderProcessor().processOrder(flashSaleContext);}
}

真实场景问题解决方案

流程标准化问题
解决方案:将通用流程封装在模板方法中(processOrder)
效果:确保所有订单类型遵循相同处理流程

参数传递问题
解决方案:使用上下文对象(OrderContext)封装所有参数
优势:统一参数传递方式,避免方法签名膨胀

流程扩展控制
钩子方法:needSpecialNotification() 控制通知方式

空方法:beforePayment() 提供扩展点但不强制实现

异常处理机制
统一处理:在模板方法中集中处理回滚和失败流程
隔离影响:子类只需关注业务逻辑,无需处理异常传播

线程安全问题

// 示例:线程安全的模板方法实现
public final void processOrder(OrderContext context) {synchronized(this) {// 核心处理逻辑}
}

典型问题及应对策略

问题场景解决方案代码示例
需要动态调整步骤顺序使用策略模式+模板方法组合定义流程编排策略接口
部分步骤需要强制实现将方法声明为abstractprotected abstract boolean validate()
需要支持步骤的批量配置结合工厂模式创建处理器OrderProcessorFactory.createProcessor(type)
不同环境需要不同实现使用环境变量控制具体实现if(“prod”.equals(env)) { … }
需要监控每个步骤的执行时间使用模板方法包装步骤执行在方法前后添加监控逻辑

模式优化技巧

流程可视化:

// 添加流程跟踪
public final void processOrder(OrderContext context) {context.put("processStartTime", System.currentTimeMillis());// ...处理逻辑...context.put("processEndTime", System.currentTimeMillis());
}

模板方法拆分:

// 将大模板拆分为多个小模板
protected final void coreProcess() { /* 核心步骤 */ }
protected final void postProcess() { /* 后续处理 */ }

支持异步处理:

// 异步模板方法
public CompletableFuture<Void> processAsync(OrderContext context) {return CompletableFuture.runAsync(() -> processOrder(context));
}

模板方法组合:

// 组合多个模板类
class ComplexOrderProcessor extends BaseValidator implements PaymentHandler {// 组合多个模板方法
}

适用场景总结

多个子类有相同流程但不同实现细节
需要严格控制核心流程的执行顺序
存在多个相似流程需要统一维护
系统需要支持流程的渐进式扩展
需要对核心流程进行统一监控或统计

通过合理使用模板方法模式,可以提升代码复用率到70%以上,同时保持系统的扩展性和可维护性。当遇到需要动态修改流程结构的需求时,可考虑与责任链模式结合使用。

一句话总结

模板方法模式定义了一个算法的骨架,将一些步骤延迟到子类中实现,使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤。

相关文章:

模板方法模式详解

模板方法模式详解及真实场景解决方案 推荐学习完策略模式和模板方法模式看这个案例&#xff1a; 策略与模板方法模式组合详解 模式定义 模板方法模式是一种行为设计模式&#xff0c;在父类中定义算法的骨架&#xff0c;允许子类在不改变算法结构的情况下重写特定步骤。核心思…...

基于SSM邮件收发管理系统(带源码、论文)

摘要 随着互联网技术的迅速发展和普及&#xff0c;网络通信已经成了人们离不开的通信手段。作为最早出现的网络通信方式还有世界上应用最为广泛的网络服务之一&#xff0c;电子邮件综合了电话通信和传统邮件的特点&#xff0c;具有传播速度快、价格低廉的优良特性。随着技术发…...

1990-2019年各地级市GDP数据

1990-2019年各地级市GDP数据 1、时间&#xff1a;1990-2019年 2、来源&#xff1a;城市年鉴 3、指标&#xff1a;行政区划代码、年份、省份、城市、经度、纬度、地区生产总值(万元) 4、范围&#xff1a;250地级市 5、指标解释&#xff1a;地区生产总值&#xff08;Gross R…...

Scala相关知识学习总结5

1、多维数组 定义&#xff1a; val arr Array.ofDim[Double](3,4) 表示二维数组中有三个一维数组&#xff0c;每个一维数组有四个元素。 2、列表 List 不可变 List&#xff1a;默认不可变&#xff0c;可创建有序且可重复的列表&#xff0c;可使用:从右向左增加数据&#xf…...

【LangChain Agent 】详解,构建自主决策的 LLM 应用

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是 Lang Chain 2、什么是 Agent 二、LangChain …...

Scala基础知识7

一&#xff0c;可变数组和不可变数组的转换方法: 不可变数组转换为可变数组使用 toBuffer 函数. 可变数组转换为不可变数组使用 toArray 函数。 转换过程中原始数组不会发生变化&#xff0c;而是返回一个新的数组。 二&#xff0c;多维数组 使用 Array of 函数创建多维数组&am…...

vmware、centos: 快照、redis集群克隆、启动异常

问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 启动虚拟机报错&#xff1a; 指定的虚拟磁盘需要进行修复 打不开磁盘“D:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位-000001.vmdk”或它所依赖的某个快照磁盘。 模块“Disk”启动失败。 未能启动虚拟机…...

visual studio断点无法进入

问题背景&#xff1a; 使用VSQt进行编码&#xff0c;新增函数处断点无法进入。 问题排查 查看moc文件&#xff0c;汇编代码以及设置调试选项均不生效。 原因分析 之前无意间进行了排版优化&#xff0c;导致新增的代码未正常编译进去&#xff0c;通过“文件-> 高级保存选…...

CNVD-2025-06046:Google Chrome沙箱逃逸漏洞大揭秘与防护指南

CNVD-2025-06046&#xff1a;Google Chrome沙箱逃逸漏洞大揭秘与防护指南 前言&#xff1a;浏览器界的“越狱”事件 嘿&#xff0c;小伙伴们&#xff01;今天咱们要聊的不是什么好莱坞大片&#xff0c;而是一出在浏览器世界里真实上演的“越狱”大戏&#xff01;你没听错&…...

androd的XML页面 跳转 Compose Activity 卡顿问题

解决 XML 点击跳转到 Compose Activity 卡顿问题 当从 XML 布局的 Activity 跳转到 Compose Activity 时出现卡顿现象&#xff0c;这通常是由以下几个原因导致的&#xff1a; 可能的原因及解决方案 1. Compose 首次初始化开销 问题&#xff1a;Compose 框架首次初始化需要时…...

Springboot同时支持不同的数据库,Oracle,Postgresql

关键字 Java&#xff0c;Springboot&#xff0c;Vscode&#xff0c;支持多种数据库 背景环境 我在实际项目开发工程中遇到这样一个问题&#xff0c;用户 A 使用 Oracle 数据库&#xff0c;用户 B 使用 Postgresql 数据库&#xff0c;但是用户 AB 都使用我们的项目。所以项目…...

【计网】TCP协议的拥塞控制与流量控制

拥塞控制与流量控制的区别 流量控制 流量控制主要是控制端到端&#xff08;发送端和接收端&#xff09;之间的数据传输量&#xff0c;是局部的机制。 目的&#xff1a;防止发送方发送数据过快导致接收方来不及处理实现方式&#xff1a;通过滑动窗口机制&#xff0c;接收方通…...

Redis - 字典(Hash)结构和 rehash 机制

字典结构 Redis中的字典由dict.h/dict结构表示: typedef struct dict ( //类型特定函数dictType *type;//私有数据 void "privdata;//哈希表 dictht ht[2];//rehash索引 //当rehash不在进行时,值为-1 in trehashidx; } dict; Redis字典所使用的哈希表由dict.h/dictht 结…...

Redis 与 MongoDB 对比分析

Redis 与 MongoDB 对比分析 1. 核心定位 Redis&#xff1a;内存键值数据库&#xff0c;侧重高性能读写和低延迟&#xff0c;常用于缓存、实时分析、消息队列等场景。MongoDB&#xff1a;分布式文档型数据库&#xff0c;侧重灵活的数据模型和大规模数据存储&#xff0c;支持复…...

【愚公系列】《高效使用DeepSeek》058-选题策划

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

解决 Lettuce 在 Redis 集群模式下的故障转移问题

引言 在高可用系统中&#xff0c;故障转移是确保服务不中断的重要机制。当我们使用 Lettuce 作为 Redis 的 Java 客户端时&#xff0c;如何高效地处理故障转移成为一项关键任务。本篇文章将探讨如何在 Redis 集群模式下配置 Lettuce 以优化故障转移。 背景 在初期设置 Lettu…...

Vim搜索和替换

模式 命令模式 操作过程 键入/开始搜索&#xff0c;找到想要搜索的内容后直接回车&#xff0c;此时光标会从搜索框回到编辑器中。 之后可以 使用小写n跳到下一个符合条件的内容&#xff0c;使用大写N跳到上一个搜索的内容。也可以直接使用上下左右按钮调整光标位置。...

【探商宝】 Llama 4--技术突破与争议并存的开源多模态

核心亮点 混合专家架构&#xff08;MoE&#xff09;的全面应用 Llama 4 是 Meta 首个全系列采用 MoE 架构 的模型&#xff0c;通过稀疏激活机制显著提升效率。例如&#xff1a; Llama 4 Scout&#xff08;中杯&#xff09;&#xff1a;16 位专家&#xff0c;17B 活跃参数&#…...

可发1区的超级创新思路(python 实现):一种轻量化的动态稀疏门控网络

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、应用领域 视频异常检测、生成视频检测。 二、模型解析 该模型由1.关键帧动态选择机制、2.关键帧动态选择机制以及3.关键帧动态选择机制三大核心组件构成,形成端到端的视频异常…...

flink cdc的source数据流如何配置事件时间,如何设置时间语义,分配时间戳并生成水位线

在 Flink CDC 中为 Source 数据流配置事件时间需要结合时间语义设置、时间戳分配和水位线生成三个核心步骤。以下是具体配置方法及注意事项&#xff1a; 1. 设置时间语义 Flink 默认使用处理时间&#xff08;Processing Time&#xff09;&#xff0c;需显式指定事件时间语义&a…...

Vue3:初识Vue,Vite服务器别名及其代理配置

一、创建一个Vue3项目 创建Vue3项目默认使用Vite作为现代的构建工具&#xff0c;以下指令本质也是通过下载create-vue来构建项目。 基于NodeJs版本大于等于18.3&#xff0c;使用命令行进行操作。 1、命令执行 npm create vuelatest输入项目名称 2、选择附加功能 选择要包含的功…...

医疗场景与事件驱动的高匹配颗粒度医疗智能体研发方向探析(代码版)

结合技术实现、应用场景与挑战展开分析: 一、医疗场景驱动的智能体核心方向 全场景覆盖的诊疗辅助医疗智能体系统编程方案 1.1、技术架构设计 #mermaid-svg-OKB0oAt38jXWNClG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…...

HTML5 浏览器兼容性:让旧浏览器也能拥抱 HTML5

在前端开发领域&#xff0c;HTML5 带来了一系列令人兴奋的新特性和功能&#xff0c;极大地提升了用户体验和开发效率。然而&#xff0c;由于互联网用户使用的浏览器版本千差万别&#xff0c;部分旧版本浏览器并不支持 HTML5&#xff0c;这给开发者带来了兼容性方面的挑战。不过…...

Kubernetes 集群搭建(三):使用dashboard用户界面(需要访问外网获取yaml)

&#xff08;一&#xff09;简介 K8s Dashboard是Kubernetes提供的一种基于Web的用户界面工具&#xff0c;用于可视化地管理和监控Kubernetes集群 主要功能&#xff1a; 资源查看与管理&#xff1a; 查看Kubernetes集群中的各种资源&#xff0c;如节点、Pod、服务、部署等。 对…...

【图像处理基石】什么是ISP色彩管理?

在ISP&#xff08;Image Signal Processor&#xff0c;图像信号处理器&#xff09;管线中&#xff0c;色彩管理是图像处理流程的核心环节&#xff0c;主要负责从传感器原始数据&#xff08;RAW&#xff09;到最终输出图像&#xff08;如YUV、RGB或JPEG&#xff09;的色彩转换、…...

金融维度下的公链价值重构:重塑财富新秩序

公链的引言&#xff1a; 众人对 Crypto、Token 的探讨热度居高不下。在此大背景下&#xff0c;我打算另辟蹊径&#xff0c;从金融维度重新剖析区块链分布式账本。那么&#xff0c;我们究竟该如何正确认知它&#xff1f;又该如何搭建起一套从金融视角出发的分析框架呢&#xff1…...

LeetCode算法题(Go语言实现)_34

题目 考虑一棵二叉树上所有的叶子&#xff0c;这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。 如果有两棵二叉树的叶值序列是相同&#xff0c;那么我们就认为它们是 叶相似 的。 如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的&#xff0c;则返回 true&…...

# 项目部署指南:Flask、Gradio与Docker实现流程

Python项目部署指南&#xff1a;Flask、Gradio与Docker实践 1. 引言 在机器学习和Web开发中&#xff0c;将模型或应用部署为在线服务是关键一步。本文将介绍如何使用 Flask 和 Gradio 快速构建前端界面&#xff0c;并通过 Docker 容器化实现高效部署&#xff0c;涵盖完整流程图…...

2022第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(题解解析)

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、九进制转十进制-&#xff08;解析&#xff09;-简单的进制转化问题&#x1f604; 2、顺子日期-&#xff08;解析&#xff09;-考察日期 3…...

UML之序列图的参与者与生命线

序列图是建模过程中必选的一种描述行为的手段&#xff0c;它展示在某些有用的行为中元素之间的消息交换和相互作用。交互是构成行为的一个单元&#xff1b;这些元素必须是可连接元素&#xff0c;通常将这些可连接元素称为交互中的参与者&#xff08;Participants&#xff09;。…...

基于Python Flask快速构建网络安全工具资源库的Web应用实践

引言 在网络安全领域&#xff0c;信息收集&#xff08;OSINT&#xff09;是渗透测试、漏洞挖掘和威胁分析的关键环节。然而&#xff0c;面对海量工具和分散的技术文档&#xff0c;安全研究人员常需耗费大量时间查找和比对工具信息。本文将介绍如何利用 Python Flask HTML 技…...

xv6-labs-2024 lab1

lab-1 注&#xff1a;实验环境在我的汇编随手记的末尾部分有搭建教程。 0.前置 第零章 xv6为我们提供了多种系统调用&#xff0c;其中&#xff0c;exec将从某个文件里读取内存镜像(这确实是一个好的说法)&#xff0c;并且将其替换到调用它的内存空间&#xff0c;也就是这个…...

HTTP Form v.s. Flask-WTF Form v.s. Bootstrap Form

在Flask-WTF和Bootstrap 的Form创建中,添加了页面显示Flash Messages。 相比Flask_WTF, Bootstrap用 render_form(form)渲染样式,自动带错误提示,不需要像Flask_WTF那样手写 for error in ... 。 项目结构: register_app/ ├── HTTP_Form_App.py ├── FlaskWTF_Form…...

Linux网络编程——https的协议及其加密解密方式

目录 一、前言 https协议 常见的加密方式 1、对称加密 2、非对称加密 3、数字签名 1. 只用对称加密 2、只用单一的非对称加密 3、双方都使用非对称加密 4、非对称加密对称加密 证书 证书颁发流程 服务器与客户端的证书验证流程 5、证书非对称加密对称加密 前言 上一…...

Node.js 下载与安装(图文)

下载 官网&#xff1a;【直达&#xff1a;https://nodejs.org/en/】。 点击【Download】&#xff0c;选择【版本&#xff0c;系统】。点击【Windows Installer(.msi)】。 安装 双击【.msi文件】&#xff0c;选择【安装路径】&#xff0c;也可以一直【下一步】。 查看版本 …...

3.31-4.06 Web3 游戏周报:Pebble 玩家留存率登顶,Treasure DAO 面临重组危机

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.31–4.06】Web3 游戏行业动态 链游生态系统 Treasure DAO 因财务危机面临重组&#xff0c;将终止游戏运营和 Treasure Chain3A 链游 Shrapnel 开发商 Neon Machine 深陷财务…...

echarts生成3D立体地图react组件

地图散点图效果&#xff1a; react项目中安装echarts、echarts-gl依赖&#xff1a; npm install echarts echarts-gl 文件目录结构&#xff1a; 地图组件map目录下文件代码&#xff0c;点击散点图圆点触发事件handleCityClick&#xff1a; index.jsx&#xff1a; import { …...

Node.js 中处理 Excel 文件的最佳实践

在现代应用开发中&#xff0c;Excel 文件仍然是数据交换和存储的重要格式之一。在 Node.js 环境中&#xff0c;处理 Excel 文件的需求日益增加。本文将介绍如何在 Node.js 中高效地处理 Excel 文件&#xff0c;涵盖工具选择、基本操作和最佳实践。 1. 选择合适的库 在 Node.js…...

解决Ubuntu系统鼠标不流畅的问题

电脑是联想的台式组装机&#xff0c;安装ubuntu系统&#xff08;不管是16、18、20、22&#xff09;后&#xff0c;鼠标都不流畅。最近几天想解决这个问题&#xff0c;于是怀疑到了显卡驱动上。怀疑之前一直用的是集成显卡&#xff0c;而不是独立显卡&#xff0c;毕竟2060的显卡…...

【Linux】虚拟机设置静态IP

主播我今天下午学了几节微服务课&#xff0c;上课的时候&#xff0c;直接把手机拿走了去上课&#xff08;电脑连的我手机的热点&#xff09;&#xff0c;虚拟机没关&#xff0c;晚上主播我回来继续学&#xff0c;电脑连上热点之后&#xff0c;发现虚拟机连接不上了&#xff0c;…...

Web API:AbortController

Web API&#xff1a;AbortController 主要用途基本工作原理基本用法示例高级用例1. 实现请求超时2. 取消多个请求3. 与其他异步 API 一起使用 浏览器支持总结 主要用途 AbortController 是一个 Web API&#xff0c;主要用于取消一个或多个 Web 请求&#xff08;如 fetch 请求&…...

服务器配置虚拟IP

服务器配置虚拟IP的核心步骤取决于具体场景&#xff0c;主要包括本地单机多IP配置和高可用集群下的虚拟IP管理两种模式。‌ 一、本地虚拟IP配置&#xff08;单服务器多IP&#xff09; ‌基于Linux系统‌&#xff1a; ‌确认网络接口‌&#xff1a;使用 ip addr 或 ifconfig 查…...

《AI大模型应知应会100篇》第5篇:大模型发展简史:从BERT到ChatGPT的演进

第5篇&#xff1a;大模型发展简史&#xff1a;从BERT到ChatGPT的演进 摘要 近年来&#xff0c;人工智能领域最引人注目的进步之一是大模型&#xff08;Large Language Models, LLMs&#xff09;的发展。这些模型不仅推动了自然语言处理&#xff08;NLP&#xff09;技术的飞跃&…...

小球反弹(蓝桥杯C语言)

有一长方形&#xff0c;长为 343720343720 单位长度&#xff0c;宽为 233333233333 单位长度。在其内部左上角顶点有一小球 (无视其体积)&#xff0c;其初速度如图所示且保持运动速率不变&#xff0c;分解到长宽两个方向上的速率之比为 dx:dy15:17dx:dy15:17。小球碰到长方形的…...

Java面试39-Zookeeper中的Watch机制的原理

Zookeeper是一个分布式协调组件&#xff0c;为分布式架构下的多个应用组件提供了顺序访问控制能力。它的数据存储采用了类似于文件系统的树形结构&#xff0c;以节点的方式来管理存储在Zookeeper上的数据。 Zookeeper提供了一个Watch机制&#xff0c;可以让客户端感知到Zooke…...

3️⃣ Coze工作流基础教学(2025年全新版本)

目录 一、什么是工作流 二、为什么用工作流 三、工作流使用场景 四、怎么学习工作流 五、工作流功能概述 六、制作工作流基础流程 6.1 创建工作流 6.2 配置工作流 6.3 调试工作流 6.4 发布工作流 6.5 使用工作流 6.6 复制工作流 6.7 删除工作流 6.8 设置工作流异…...

备战蓝桥杯——走迷宫问题(BFS解决)

这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制&#xff1a;广度优先搜索按层遍历所有可能的路径&#xff0c;首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用&#xff1a;通过队列按先进先出的顺序处理节点&#xff0c;确保每一步探索的都是当…...

usbip学习记录

USB/IP: USB device sharing over IP make menuconfig配置&#xff1a; Device Drivers -> Staging drivers -> USB/IP support Device Drivers -> Staging drivers -> USB/IP support -> Host driver 如果还有作为客户端的需要&#xff0c;继续做以下配置&a…...

mlir-tblgen 的应用渐进式示例

示例01 -gen-dialect-decls toy_dia.1.toy include "mlir/IR/OpBase.td" //include "mlir/IR/FunctionInterfaces.td" //include "mlir/IR/SymbolInterfaces.td" //include "mlir/Interfaces/SideEffectInterfaces.td"def Toy_Diale…...

AI大模型与未来社会结构的重构:从工具到共生体

一、引言&#xff1a;从蒸汽机到ChatGPT&#xff0c;文明的每一次跃迁都始于“工具的自我进化” 历史长河中&#xff0c;每一次技术革命&#xff0c;都伴随着人类社会组织、认知方式乃至价值体系的巨变。从18世纪的蒸汽机到20世纪的信息技术&#xff0c;再到21世纪的人工智能&…...