C++软件设计模式之模板方法模式
模板方法模式是面向对象软件设计模式之一,其主要意图是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。
动机
在软件开发中,常常会遇到这样的情况:一个任务可以被分解为多个步骤来完成,其中有些步骤的实现方法是对所有子类通用的,而有些步骤则需要针对不同的子类有不同的实现方式。模板方法模式正是解决这一问题的有效手段。通过使用模板方法模式,可以将不变的部分代码抽离出来放在基类中,而将可变的部分留给子类去实现。这样不仅减少了代码的重复,而且还能够保证变与不变的部分之间的联系。
意图
模板方法模式的主要意图是定义一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。这样做可以让子类在不改变算法整体结构的前提下去重写算法的某些特定部分。
适用场合
- 不变的算法骨架:当某个抽象类有多个子类,但是它们有共同的算法步骤,只是某些步骤的具体实现不同,可以通过模版方法模式将这些不变的部分提取到抽象类中,子类只需要实现特定的步骤。
- 避免代码重复:多个类中若有一段代码完全相同或相似,可以考虑使用模版方法模式来抽取共享的部分,减少代码重复。
- 控制子类扩展:模版方法模式可以通过在模版方法中调用“钩子”方法,来控制子类在生命周期中的特定点上能够做什么,不能够做什么。钩子方法在抽象类中通常是空实现,子类可以覆盖这些方法来实现特定功能。
示例
模板方法模式的一个经典示例是咖啡店和茶馆的饮料制作过程。制作咖啡和茶的基本流程大致相同(准备热水、冲泡、倒入杯子、加调料),但具体的步骤(如冲泡的方式、加何种调料)则不同。通过定义一个模版方法来实现这个流程,基类可以控制整个流程的执行顺序,而具体的冲泡和加调料动作则由子类实现。
模板方法模式是一种非常有用的设计模式,在很多框架和库中都有应用。正确地使用模版方法模式可以使代码更加清晰、易于扩展和维护。
面是一个简单的C++示例,展示了如何使用模板方法模式来实现咖啡和茶的制作过程。在这个例子中,基类 Beverage
定义了一个模板方法 prepareRecipe()
,该方法包含了制作饮料的通用步骤,而具体的步骤(如冲泡和添加调料)则由子类实现。
代码示例
#include <iostream>
using namespace std;// 基类:Beverage
class Beverage {
public:// 模板方法,定义了制作饮料的算法骨架void prepareRecipe() {boilWater();brew();pourInCup();addCondiments();}// 子类不需要覆盖的方法,因为这些步骤对所有饮料都是相同的void boilWater() {cout << "Boiling water" << endl;}void pourInCup() {cout << "Pouring into cup" << endl;}// 子类必须覆盖的方法,因为这些步骤对不同饮料是不同的virtual void brew() = 0; // 纯虚函数,必须在子类中实现virtual void addCondiments() = 0; // 纯虚函数,必须在子类中实现
};// 子类:Coffee
class Coffee : public Beverage {
public:void brew() override {cout << "Dripping Coffee through filter" << endl;}void addCondiments() override {cout << "Adding Sugar and Milk" << endl;}
};// 子类:Tea
class Tea : public Beverage {
public:void brew() override {cout << "Steeping the tea" << endl;}void addCondiments() override {cout << "Adding Lemon" << endl;}
};int main() {cout << "Making Coffee..." << endl;Coffee coffee;coffee.prepareRecipe();cout << "\nMaking Tea..." << endl;Tea tea;tea.prepareRecipe();return 0;
}
运行结果
Making Coffee...
Boiling water
Dripping Coffee through filter
Pouring into cup
Adding Sugar and MilkMaking Tea...
Boiling water
Steeping the tea
Pouring into cup
Adding Lemon
解释
-
基类
Beverage
:prepareRecipe()
是模板方法,定义了制作饮料的步骤:煮水、冲泡、倒入杯子、加调料。boilWater()
和pourInCup()
是所有饮料共有的步骤,因此在基类中实现。brew()
和addCondiments()
是纯虚函数,需要在子类中实现,因为这些步骤对不同的饮料有不同的实现。
-
子类
Coffee
和Tea
:Coffee
子类实现了brew()
和addCondiments()
,分别表示冲泡咖啡和添加糖和牛奶。Tea
子类实现了brew()
和addCondiments()
,分别表示泡茶和添加柠檬。
-
main
函数:- 创建
Coffee
和Tea
对象,并调用它们的prepareRecipe()
方法,输出了制作咖啡和茶的过程。
- 创建
适用场合
- 通用流程,具体步骤不同:当多个子类需要遵循相同的流程,但具体的步骤实现不同,可以使用模板方法模式。例如,不同的支付方式(信用卡、支付宝、微信)可以遵循相同的支付流程,但具体的支付接口和验证方式不同。
- 避免重复代码:在多个子类中存在相同的逻辑时,可以将这些逻辑提取到基类的模板方法中,避免代码重复。
模板方法模式通过将算法的结构固定,允许子类灵活地实现具体步骤,提供了一种优雅的方式来处理类似的任务。
模板方法模式经常与其他设计模式协同使用,以解决更复杂的设计问题。常见的协同模式包括策略模式、工厂方法模式和状态模式等。下面我们将重点介绍模板方法模式与策略模式的协同使用,并给出一个C++代码示例。
模板方法模式与策略模式的协同使用
动机
模板方法模式用于定义一个算法的骨架,而将某些步骤的实现延迟到子类中。策略模式用于定义一系列可互换的算法,并将这些算法封装在独立的类中。通过将策略模式与模板方法模式结合,可以在一个模板方法中使用不同的策略,从而提供更大的灵活性。
适用场景
- 算法的某些步骤需要根据不同的条件动态选择不同的实现:可以通过策略模式将这些步骤的实现封装在不同的策略类中,然后在模板方法中根据需要选择合适的策略。
- 需要在运行时动态改变算法的某些步骤:策略模式允许在运行时动态更换算法,而模板方法模式确保了算法的整体结构不变。
代码示例
假设我们有一个任务是处理数据,不同的处理策略可以根据不同的需求进行选择。我们使用模板方法模式来定义数据处理的骨架,使用策略模式来实现不同的处理策略。
1. 定义策略接口和具体策略
// 策略接口
class DataProcessingStrategy {
public:virtual void process() = 0;virtual ~DataProcessingStrategy() = default;
};// 具体策略1:压缩数据
class CompressStrategy : public DataProcessingStrategy {
public:void process() override {cout << "Compressing data" << endl;}
};// 具体策略2:加密数据
class EncryptStrategy : public DataProcessingStrategy {
public:void process() override {cout << "Encrypting data" << endl;}
};// 具体策略3:校验数据
class VerifyStrategy : public DataProcessingStrategy {
public:void process() override {cout << "Verifying data" << endl;}
};
2. 定义抽象类和模板方法
// 抽象类
class DataProcessor {
protected:DataProcessingStrategy* strategy;public:DataProcessor(DataProcessingStrategy* s) : strategy(s) {}virtual ~DataProcessor() {delete strategy;}// 模板方法void processData() {load();strategy->process();save();}virtual void load() {cout << "Loading data" << endl;}virtual void save() {cout << "Saving data" << endl;}
};
3. 定义具体的数据处理器
// 具体的数据处理器1:使用压缩策略
class CompressDataProcessor : public DataProcessor {
public:CompressDataProcessor() : DataProcessor(new CompressStrategy()) {}
};// 具体的数据处理器2:使用加密策略
class EncryptDataProcessor : public DataProcessor {
public:EncryptDataProcessor() : DataProcessor(new EncryptStrategy()) {}
};// 具体的数据处理器3:使用校验策略
class VerifyDataProcessor : public DataProcessor {
public:VerifyDataProcessor() : DataProcessor(new VerifyStrategy()) {}
};
4. 客户端代码
#include <iostream>
using namespace std;int main() {// 使用压缩策略处理数据cout << "Using Compress Strategy..." << endl;DataProcessor* processor1 = new CompressDataProcessor();processor1->processData();delete processor1;// 使用加密策略处理数据cout << "\nUsing Encrypt Strategy..." << endl;DataProcessor* processor2 = new EncryptDataProcessor();processor2->processData();delete processor2;// 使用校验策略处理数据cout << "\nUsing Verify Strategy..." << endl;DataProcessor* processor3 = new VerifyDataProcessor();processor3->processData();delete processor3;return 0;
}
运行结果
Using Compress Strategy...
Loading data
Compressing data
Saving dataUsing Encrypt Strategy...
Loading data
Encrypting data
Saving dataUsing Verify Strategy...
Loading data
Verifying data
Saving data
解释
-
策略接口
DataProcessingStrategy
:- 定义了一个纯虚函数
process()
,用于实现数据处理的具体策略。 - 具体策略
CompressStrategy
、EncryptStrategy
和VerifyStrategy
分别实现了数据压缩、加密和校验的策略。
- 定义了一个纯虚函数
-
抽象类
DataProcessor
:- 包含一个策略对象
strategy
,并通过构造函数传递具体的策略对象。 - 定义了模板方法
processData()
,该方法调用了load()
、strategy->process()
和save()
,确保数据处理的流程一致。 load()
和save()
是通用的数据加载和保存步骤,可以在子类中根据需要进行扩展。
- 包含一个策略对象
-
具体数据处理器类:
CompressDataProcessor
、EncryptDataProcessor
和VerifyDataProcessor
分别使用不同的策略对象初始化DataProcessor
。
-
客户端代码:
- 创建不同的数据处理器对象,并调用
processData()
方法来处理数据,输出了不同的处理策略的结果。
- 创建不同的数据处理器对象,并调用
通过这种方式,模板方法模式和策略模式的结合提供了更大的灵活性,允许在运行时动态选择不同的数据处理策略,同时保持数据处理流程的一致性。
相关文章:
C++软件设计模式之模板方法模式
模板方法模式是面向对象软件设计模式之一,其主要意图是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。 动机 在软件开发中,常常会遇到这样的情…...
20241231 机器学习ML -(2)KNN(scikitlearn)
1. build DKTree 递推创建Tree;当前维度找中位数分割 数据集 left set,Node(mid), right set. * 循环维度(当log(Nsample)>featureSize) 2. DKTree KNN search * 理论部分向量几何有介绍。 每个维度列中,中位数对应的数据点…...
Prometheus之终极指南(The Ultimate Guide to Prometheus)
Prometheus之终极指南 Prometheus 彻底改变了我们在现代 DevOps 生态系统中监控基础设施、应用程序和服务的方式。它不仅仅是一个工具;它是一个由指标收集、告警和实时监控组成的生态系统,受到 Uber、Google 和 SoundCloud 等组织的信任。在本文中&…...
如何使用Python调用淘宝api接口获取商品详情信息?
使用 Python 调用淘宝 API 接口获取商品详情信息,可按照以下步骤进行: 注册并获取 API 密钥 访问淘宝api文档,点击 “立即测试” 按钮,按照提示完成注册流程。注册成功后,登录测试平台,进入 “控制台” 页面…...
ubuntu 22下解决Unment dependencies问题
问题现象 在使用apt安装包的时候,出现如下错误: 解决方案 第一步 sudo apt-get -f install sudo apt-get update sudo apt-get upgrade第二步 sudo apt-get update sudo apt-get clean sudo apt-get autoremove第三步 sudo apt --fix-broken inst…...
leetcode 热题100(155. 最小栈)multiset c++
链接:155. 最小栈 - 力扣(LeetCode) 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。…...
某小程序sign签名参数逆向分析
文章目录 1. 写在前面2. 接口分析3. 分析还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...
阿里云redis内存优化——PCP数据清理
在阿里云安装了一个redis节点,今天使用时忽然想着点击了一下分析内存。好家伙,居然崩出了一个30多M的块出来。问题是我本地安装的redis没有这个啊,怎么奇怪冒出这个来了。 本着把系统用干榨尽的态度,研究了下这个问题的来源。网上…...
YOLOv10-1.1部分代码阅读笔记-head.py
head.py ultralytics\nn\modules\head.py 目录 head.py 1.所需的库和模块 2.class Detect(nn.Module): 3.class Segment(Detect): 4.class OBB(Detect): 5.class Pose(Detect): 6.class Classify(nn.Module): 7.class WorldDetect(Detect): 8.class RTDETRDec…...
java开发中注解汇总
注解作用位置注意mybatis Data Getter Setter ToString EqualsAndHashCode AllArgsConstructor NoArgsConstructor Data 代替:无参构造,get,set,toString,hashCode,equals Getter Setter 可放在类和方法上&…...
Java开发 PDF文件生成方案
业务需求背景 业务端需要能够将考试答卷内容按指定格式呈现并导出为pdf格式进行存档,作为紧急需求插入。导出内容存在样式复杂性,包括特定的字体(中文)、字号、颜色,页面得有页眉、页码,数据需要进行表格聚…...
Python机器学习笔记(十七、分箱、离散化、线性模型与树)
数据表示的最佳方法:取决于数据的语义,所使用的模型种类。 线性模型与基于树的模型(决策树、梯度提升树和随机森林)是两种成员很多同时又非常常用的模 型,它们在处理不同的特征表示时就具有非常不同的性质。我们使用w…...
[极客大挑战 2019]Http 1
进入环境: 检查源码发现有一个链接,但是这里没有绑定,需要手动跳转,打开后,发现提示: 这里就是需要我们从https://Sycsecret.buuoj.cn来访问它 因此我们抓包,使用referer:服务器伪造…...
最近学习shader的一些总结
旨在总结最近学习shader过程中一些关键要素,强化下记忆,如果有错误也烦请指出。 1.Properties 可调节变量,用于定义从外部传入到内部的变量, 以及外部通过访问这些变量名, 可以获取这些变量的值 其中定义时指定的类型, 在后文中类型不一定相同(基本不…...
庐山派K230学习日记1 从点灯到吃灰
1 简介 庐山派以K230为主控芯片,支持三路摄像头同时输入,典型网络下的推理能力可达K210的13.7倍(算力约为6TOPS)。支持CanMV,可作为AI与边缘计算平台 K230简介 K230芯片集成了两颗RISC-V处理器核心,双核…...
在Swagger(现称为OpenAPI)中各类@api之间的区别
在Swagger(现称为OpenAPI)中,ApiOperation 是用来描述单个API操作的注解。除此之外,Swagger还提供了其他一些类似的注解,它们用于不同层次或目的来增强API文档的详细程度和可读性。以下是这些注解及其之间的区别&#…...
【网络协议】开放式最短路径优先协议OSPF详解(二)
前言 第一部分:【网络协议】开放式最短路径优先协议OSPF详解(一) 在第一部分中,我们了解了链路状态路由协议并讨论了 OSPF 的工作原理,同时学习了如何配置 OSPF。在本章的第二部分中,我们将进一步探讨 OS…...
windows文件夹自定义右键调用powershell完成7zip加密打包
准备powershell脚本 2. regedit的路径是:计算机\HKEY_CLASSES_ROOT\Directory\shell\,在此项目下新增子项目diy_command\command,command的数据值为powershell D:\windowsProjects\directory_diy.ps1 %1 效果,点击后进入和power…...
MySQL 入门教程
MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 在本教程中,会让大家快速掌握MySQL的基本知识,并轻松使用MySQL数据库。 什么…...
BOOST 库在机器视觉中的应用及示例代码分析
一、引言 机器视觉是一门让计算机模拟人类视觉功能,对图像或视频数据进行理解、分析和决策的学科领域。在机器视觉的开发过程中,常常需要高效处理各种数据结构、进行数值计算、实现多线程并行处理以及运用优秀的算法框架等。BOOST 库作为一个功能强大、…...
第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
自然语言处理(NLP)中的词嵌入(Word2Vec、GloVe)技术,是NLP领域的重要组成部分,它们为词汇提供了高维空间到低维向量的映射,使得语义相似的词汇在向量空间中的距离更近。以下是对这些技术的详细解…...
Log4j2 详解(异步日志打印及CSV格式日志输出)
Log4j2 详解 Apache Log4j2 是一个功能强大的 Java 日志记录框架,提供高性能和灵活的配置。本文档涵盖了 Log4j2 的核心功能及其详细使用方式,包括基础配置、异步日志、CSV 格式日志的输出以及使用注意事项。 一 Log4j2 基础概念与配置 1.1 Log4j2 介绍…...
[网络安全] DVWA之Content Security Policy (CSP) Bypass 攻击姿势及解题详析合集
CSP概念 CSP 是 Content Security Policy(内容安全策略)的缩写,是一种用于增强 Web 应用程序安全性的安全机制。它通过允许网站管理员控制页面中加载内容的来源来减少跨站脚本攻击(XSS)等常见的安全风险。 CSP 的工作…...
linux shell脚本 【分支结构case...in 、循环结构、函数】内附练习
1.思维导图 2.练习 1.定义一个find函数,查找ubuntu和root的gid 2.定义一个数组,写一个函数完成对数组的冒泡排序 bubble() {n${#arr[*]}for((i0;i<n-1;i));dofor((j0;j<n-1-i;j));doif ((arr[j]>arr[j1]));thentemp${arr[j]}arr[j]${arr[j1]}a…...
C# 设计模式(结构型模式):桥接模式
C# 设计模式(结构型模式):桥接模式 在软件设计中,我们经常会遇到系统的变化频繁,或者需要灵活扩展功能的场景。这时,桥接模式(Bridge Pattern)便显得尤为重要。桥接模式是一个结构型…...
RC充电电路仿真与分析
RC充电原理 下图是一个常见的RC充电电路:(假设R10K,C100nF) SW断开时,这个电路处于断路状态,C既没有充电也没有放电;SW闭合时,直流电源5V为电容C充电; 充电时电容两端…...
在 SQL 中获取第m个开始的n条记录方法汇总
在 SQL 中,要获取第m个开始的n条记录,主要取决于你使用的数据库系统和支持的功能。以要获取第10个开始的20条记录为例说明几种常见的方法: 1. 使用 LIMIT 和 OFFSET 适用于 MySQL、PostgreSQL 等支持 LIMIT 的数据库。 SELECT * FROM table…...
Linux 35.6 + JetPack v5.1.4之编译 pytorch
Linux 35.6 JetPack v5.1.4之编译 pytorch 1. 源由2. 折腾3. 构建步骤3.1 下载代码3.2 编译选项3.3 CUDA选项3.4 CUDA路径3.5 版本控制3.6 编译whl 4. 总结5. 参考资料 1. 源由 目前,有很多科研性质的自动导航的开源代码,例如: Linux 35.5…...
docker 部署nginx
1、拉取阿里的nginx镜像: docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/list_su/nginx:stable-perl 2、官方nginx镜像: docker pull nginx:stable-perl 3、创建挂载文件目录 mkdir nginx && cd nginx mkdir c…...
深入刨析数据结构之排序(上)
目录 1.内部排序 1.1概述 1.2插入排序 1.2.1其他插入排序 1.2.1.1 折半插入排序 1.2.1.2 2-路插入排序 1.3希尔排序 1.4快速排序 1.4.1起泡排序 1.4.2快速排序 1.4.2.1hoare版本 1.4.2.2挖坑版本 1.4.2.3前后指针版本 1.4.2.4优化版本 1.4.2.4.1小区间插入排序优…...
Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析
文章目录 PreApache CommonsApache Commons ProperLogging (Apache Commons Logging ) JCL 集成logbackPOM依赖配置文件 logback.xml使用 源码分析jcl-over-slf4j 的工作原理1. LogFactory 的实现2. SLF4JLogFactory 和 Log 的实例化过程3. SLF4JLog 和 …...
力扣刷题:栈和队列OJ篇(下)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 1.括号匹配问题(1)题目…...
QT:控件属性及常用控件(1)------核心控件及属性
一个图形化界面上的内容,不需要我们直接从零去实现 QT中已经提供了很多的内置控件: 按钮,文本框,单选按钮,复选按钮,下拉框等等。。。。。 文章目录 1.常用控件属性1.1 enabled1.2 geometry1.2.1 geometry…...
【juc】Lock锁和AQS的继承关系
目录 1. 说明2. Lock接口与AQS的关系2.1 Lock接口2.2 AQS(AbstractQueuedSynchronizer) 3. ReentrantLock与AQS的具体联系3.1 ReentrantLock的实现3.2 AQS在ReentrantLock中的作用 1. 说明 1.Lock锁和AQS(AbstractQueuedSynchronizer&#x…...
自学记录鸿蒙API 13:实现多目标识别Object Detection
起步:什么叫多目标识别? 无论是生活中的动物识别、智能相册中的场景分类,还是工业领域的检测任务,都能看到多目标识别的身影。这次,我决定通过学习HarmonyOS最新的Object Detection API(API 13)…...
BOC调制信号matlab性能仿真分析,对比功率谱,自相关性以及抗干扰性
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)…...
C# 事件机制
C# 事件机制详解:从概念到实践 在 C# 中,事件机制是处理对象间通信的重要方式,尤其是在 GUI 应用程序(如 WPF、WinForms)中,事件用于响应用户交互(如按钮点击、鼠标移动等)。本文将…...
使用 Python 实现随机中点位移法生成逼真的裂隙面
使用 Python 实现随机中点位移法生成逼真的裂隙面 一、随机中点位移法简介 1. 什么是随机中点位移法?2. 应用领域 二、 Python 代码实现 1. 导入必要的库2. 函数定义:随机中点位移法核心逻辑3. 设置随机数种子4. 初始化二维裂隙面5. 初始化网格的四个顶点…...
GPT分区 使用parted标准分区划分,以及相邻分区扩容
parted 是一个功能强大的命令行工具,用于创建和管理磁盘分区表和分区。它支持多种分区表类型,如 MBR(msdos)、GPT(GUID Partition Table)等,并且可以处理大容量磁盘。parted 提供了一个交互式界…...
【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
模型部署系列文章 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程【保姆级教程附代码(二)】Pytor…...
问题记录:[FATAL] [1735822984.951119148]: Group ‘manipulator‘ was not found.
前言:最近仿照UR5手眼标定的例程,在新的机械臂上进行手眼标定,还准备用easy_hand手眼标定包。将机器人功能包导入到工作空间后进行编译运行,启动launch文件: roslaunch easy_handeye eye_to_hand_CR7_calibration.lau…...
SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)
一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…...
Scrum中敏捷项目经理(Scrum Master)扮演什么角色?
敏捷开发模式已经逐渐被主流的软件研发团队所接受,其中Scrum是最具代表性的敏捷方法之一。Scrum框架中有三个核心角色:Product Owner(PO)、Scrum Master(SM)和Development Team(DT)。…...
SpringMVC(四)响应
目录 数据处理及跳转 1. 结果跳转方式 ①.ModelAndView ②.ServletAPI 1、通过HttpServletResponse进行输出 2、通过HttpServletResponse实现请求转发 3、通过HttpServletResponse实现重定向 ③.SpringMVC 1.直接输出 2.请求转发 3.重定向 2.ResponseBody响应json数…...
操作系统之文件系统
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
Android SPRD 工模测试修改
设备有两颗led灯,工模测试需全亮 vendor/sprd/proprietories-source/factorytest/testitem/led.cpp -13,6 13,10 typedef enum{#define LED_BLUE "/sys/class/leds/blue/brightness"#define LED_RED …...
C语言与操作系统
学习C语言有助于理解计算机底层原理和操作系统的工作方式 C语言自诞生以来,就与计算机底层操作紧密相连。作为一门高级编程语言,C语言提供了对硬件直接控制的能力,同时保留了结构化编程的特性,这使得它成为编写操作系统、编译器和…...
信息安全管理:网络安全
1 网络的定义和特征 1.1 网络的定义 (根本懒得说。。你们自己wiki吧) 网络的用处 What is a network…Devices in a network…LAN, WAN and InternetworksWhat do networks do for you… Sharing resourcesUse/share applications 1.2 网络的特征 Ch…...
python-leetcode-轮转数组
189. 轮转数组 - 力扣(LeetCode) class Solution:def rotate(self, nums: List[int], k: int) -> None:"""Do not return anything, modify nums in-place instead."""n len(nums)k % n # 如果 k 大于 n,…...
Windows上安装Go并配置环境变量(图文步骤)
前言 1. 本文主要讲解的是在windows上安装Go语言的环境和配置环境变量; Go语言版本:1.23.2 Windows版本:win11(win10通用) 下载Go环境 下载go环境:Go下载官网链接(https://golang.google.cn/dl/) 等待…...