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

9. 一分钟读懂“策略模式”

9.1 模式介绍

策略模式是一种行为型设计模式,用于在运行时灵活切换对象的行为或算法,它将算法封装为独立的类,使得它们可以互相替换,而不会影响使用这些算法的客户端代码。

策略模式的核心思想是:定义一系列可互换的算法或行为,将其独立于使用它们的上下文,并在运行时动态选择或切换策略

9.2 实现要素

策略模式实现3要素包括:抽象策略接口(所有策略类必须实现的公共接口)、具体策略实现类(实现了抽象策略接口,封装了不同的算法或行为,每个实现类表示一种策略)、上下文类(持有策略接口的引用,负责调用具体策略的行为)。

9.3 场景案例

策略模式可以用“支付系统”来说明,比如一个电商平台支持多种支付方式(如信用卡、支付宝、微信支付等)。用户在支付时,可以根据自己的需求选择不同的支付方式,支付逻辑完全由具体的支付策略负责。

  • 抽象策略接口:PaymentStrategy 表示支付策略接口,定义了所有支付方式必须实现的方法pay(amount),这是整个支付系统的行为标准,确保每种支付方式都能被上下文调用。

  • 具体策略实现类:每种支付方式(信用卡支付、支付宝支付、微信支付)作为独立的类实现了 PaymentStrategy 接口,分别封装了其特定的支付逻辑。

    • CreditCardPayment:实现信用卡支付逻辑。

    • AliPayPayment:实现支付宝支付逻辑。

    • WeChatPayPayment:实现微信支付逻辑。

  • 上下文类:上下文类 PaymentContext 持有 PaymentStrategy 的引用,负责调用具体的支付逻辑,它提供了设置支付策略的方法setStrategy(strategy),可以在运行时动态切换支付方式。

客户端通过调用上下文类(PaymentContext)与具体支付策略实现类(如 CreditCardPaymentAliPayPaymentWeChatPayPayment)交互,且上下文类支持动态切换支付策略。每种策略封装了具体的支付逻辑,简化了支付过程,避免了客户端代码中的复杂条件判断或硬编码。

 

为进一步加深对该模式的理解,你可以使用策略模式实现一个计算器,加减乘除、一网打尽!

相关文章:

9. 一分钟读懂“策略模式”

9.1 模式介绍 策略模式是一种行为型设计模式,用于在运行时灵活切换对象的行为或算法,它将算法封装为独立的类,使得它们可以互相替换,而不会影响使用这些算法的客户端代码。 策略模式的核心思想是:定义一系列可互换的算…...

python调用GPT-4o实时音频 Azure OpenAI GPT-4o Audio and /realtime

发现这块网上信息很少,记录一下 微软azure入口 https://learn.microsoft.com/zh-cn/azure/ai-services/openai/realtime-audio-quickstart?pivotsprogramming-language-ai-studio sdk文档 https://github.com/azure-samples/aoai-realtime-audio-sdk?tabread…...

linux查看应用程序执行时间

命令 ps -eo pid,comm,lstart,etime,args | grep -i java ps:是查看进程状态的命令。-eo:是-e和-o参数的组合,-e表示显示所有进程,-o后面跟的是自定义输出格式。pid:表示进程ID。comm:表示命令名&#x…...

mybatis之数据统计与自定义异常处理

文章目录 需求描述定义实体方式一、mybatisPlus实现方式二、自定义SQL实现简单查询过滤查询 异常处理1、SQL拼写异常 在使用Mybatis或MybatisPlus进行数据统计,在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍,本次要使用其进…...

Jenkins 中自定义Build History中显示构建信息

有时候会遇到一个代码仓库下面会有多个不同的分支,而这写分支表示着不同的开发者在开发新的需求,但是这样就会出现一个问题,在Jenkins上进行多分支构建的时候,很难找到哪一个是属于自己分支构建的,这样的问题大家应该都…...

安装certbot(ubuntu系统)

安装nginx 更新软件包列表 sudo apt update 更新软件包列表 sudo apt install nginx 更新软件包列表 sudo systemctl status nginx 注意:强烈推荐使用,系统直接安装nginx,(不推荐使用docker安装nginx)为后续更简单…...

QTextBrowser按照段落来显示html的文字

在 PyQt5 中&#xff0c;QTextBrowser 是一个用来显示富文本&#xff08;如 HTML&#xff09;内容的小部件。要让 QTextBrowser 按照段落来显示 HTML 内容&#xff0c;可以确保 HTML 中的每个段落被正确地封装在 <p> 标签中或其他合适的 HTML 标签中。 基本思路 HTML 格…...

如何让Google快速收录你的页面?

要让Google更快地收录你的网站内容&#xff0c;首先需要理解“爬虫”这个概念。Google的爬虫是帮助它发现和评估网站内容质量的工具&#xff0c;如果你的页面质量高且更新频率稳定&#xff0c;那么Google爬虫更可能频繁光顾。通常情况下&#xff0c;通过Google Search Console&…...

用Linux完成firewall-cmd配置防火墙

注意这里是openeuler的系统 假设在内网架设了一台Web服务器,IP地址是192.168.1.2,端口是80,设置内网网段192.168.1.0/24中的主机均可以访问此Web服务器,如图所示 步骤如下&#xff08;包含结果&#xff09; 这里再服务端&#xff08;192.168.131.10&#xff09;上配置&#x…...

关于光速的猜想

光速实际也可能是爱因斯坦制造出来的一个量&#xff0c;就像质量&#xff08;重力mg&#xff0c;有这个关系在&#xff0c;m起的名字后来就演变成了质量&#xff09;是牛顿造出的一个量&#xff0c;一个常量&#xff0c;刚开始都叫c&#xff0c;只是习以为常后起了个名字罢了&a…...

Mybatis-Flex的简单入门,Mybatis-Flex和其它框架对比

前言 最近做项目&#xff0c;项目组必须要用Mybatis-Flex&#xff0c;然后自己去学了一下&#xff0c;给大家进行分享。 MyBatis-Flex 是 MyBatis 的一个增强工具&#xff0c;旨在简化 MyBatis 的使用并提高开发效率。它通过提供一系列的便捷方法和特性来减少重复代码的编写&am…...

轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…...

linux的磁盘管理

认识磁盘 从外到内&#xff0c;磁道从0~XXX。扇区默认512字节先读完一个柱面的0号磁道&#xff0c;接着读第二个柱面的0号磁道……直至所有柱面的0号磁道读写完毕&#xff0c;进入下一个磁道。 磁盘命名规则 物理磁盘:sd开头&#xff1b;虚拟磁盘vd开头 sdb1&#xff1a;第二…...

Alibaba EasyExcel 导入导出全家桶

一、阿里巴巴EasyExcel的优势 首先说下EasyExcel相对 Apache poi的优势&#xff1a; EasyExcel也是阿里研发在poi基础上做了封装&#xff0c;改进产物。它替开发者做了注解列表解析&#xff0c;表格填充等一系列代码编写工作&#xff0c;并将此抽象成通用和可扩展的框架。相对p…...

使用Scala编写一个简单的决策树分类测试demo

使用Scala编写一个简单的决策树分类测试demo&#xff0c;我们可以基于Apache Spark的MLlib库来实现。这里将展示如何创建一个简单的决策树分类器&#xff0c;并用它来进行预测。我们将遵循以下步骤&#xff1a; 设置环境和导入必要的包。加载并准备数据集。构建决策树模型。使…...

SQLServer中使用ISNULL替换为指定的替换值

ISNULL (Transact-SQL) 适用于&#xff1a; SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库 NULL替换为指定的替换值。 1、语法 ISNULL ( check_expression , rep…...

69 mysql 中 is null 的实现

前言 Mysql 中我们偶尔会用到 字段为 NULL 的情况 这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 然后如果是使用 “select * from tz_test_02 where field1 null;” 你会发现查询 不出数据 但是如…...

【信息系统项目管理师】第9章:项目范围管理-基础和过程 考点梳理

文章目录 9.1 管理基础9.1.1 产品范围和项目范围9.1.2 管理新实践 9.2 项目范围管理过程9.2.1 过程概述9.2.2 裁剪考虑因素9.2.3 敏捷与适应方法 【学习建议】本章节内容属于10大管理知识领域&#xff0c;选择、案例、论文都会考&#xff0c;建议重点学习。项目范围管理包括确保…...

智能制造标准体系建设指南

一、智能制造系统架构总览 智能制造作为当今制造业转型升级的核心&#xff0c;深度整合了新一代信息技术与传统制造工艺&#xff0c;催生出一个横跨产品全生命周期、纵贯多层级组织架构&#xff0c;并彰显多元智能特性的复杂系统。这一架构从生命周期、系统层级、智能特征三个…...

怎么获取键值对的键的数值?

问&#xff1a; 通过paelData.cardMap.C0002112可以获取到Cooo2112里面的数据&#xff0c;但是有时候接口返回的不是C0002112而是C0002093或者其他值&#xff0c;请问我该怎么写&#xff1f; 后端返回的数据是这样的&#xff1a; cardMap: { C0002112: { name: Item 1, va…...

反向代理后Request.Url.AbsoluteUri获取成了内网IP

出现的问题&#xff1a;用户请求的是域名&#xff0c;而后端通过Request.Url.AbsoluteUri获取用户请求的绝对路径时&#xff0c;变成了内网IP 解决方式&#xff1a; 反向代理配置中加上&#xff1a; proxy_set_header Host $host; # proxy_set_header Host h o s t : host: h…...

NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化

论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息&#xff1a; 简介&#xff1a; 本文的背景是基于人类语言理解的组合性特征&#xff0c;即语言处理本质上是层次化的&#xff1a;语法规则将词级别的意义组合成更大的成分的意义&…...

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…...

window系统,照片应用打开图片,但是提示操作系统找不到已输入的环境选项,请问怎么解决,以便能打开图片

文章目录 问题描述问题解决一、先用AI提问&#xff0c;看能否得到解答二、最终的解决方法-修改环境变量 至此问题解决。 问题描述 Windows中&#xff0c;使用默认的图片应用打开图片时&#xff0c;提示&#xff1a; 操作系统找不到已输入的环境选项如下图&#xff1a; 这个问…...

Excel之查找函数-XLOOKUP

背景&#xff1a; 某些数据处理&#xff0c;需要对比两个乱序或者数据不完全相同的数值&#xff0c;取到另外一个数据值&#xff0c;数据量大的情况下&#xff0c;人工对比太耗时&#xff0c;XLOOKUP函数是一个查找函数&#xff0c;可以通过遍历对比某一单元格的值&#xff0c…...

深入理解 Java 内存管理:堆和栈

深入理解 Java 内存管理&#xff1a;堆和栈的全面解析 在 Java 编程语言中&#xff0c;内存管理是一个至关重要的概念&#xff0c;其中堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;是两个核心的内存区域。理解它们的工作原理、用途以及它们在程序执行过程…...

深度全解析开放开源大模型之BLOOM

BLOOM是 BigScience Large Open-science Open-access Mul-tilingual Language Model首字母的缩写。 BigScience 不是财团&#xff08;consortium&#xff09;&#xff0c;也不是正式成立的实体。这是一个由HuggingFace、GENCI和IDRIS发起的开放式协作组织&#xff0c;以及一个…...

下载谷歌浏览器的官方离线安装包

网址&#xff1a;https://support.google.com/chrome/answer/95346?hlzh-Hans&coGENIE.Platform%3DDesktop#zippy%2Cwindows...

ORACLE创建用户报错ORA-65096: invalid common user or role name

在高版本的oracle中创建用户时提示错误ORA-65096: invalid common user or role name&#xff0c;官网说明用户名必须使用C##或c##开头。以下方法亲测有效。 通过设置"_ORACLE_SCRIPT"参数为true来临时绕过CDB中创建用户必须以"C##"开头的限制。请注意&…...

河工oj第七周补题题解2024

A.GO LecturesⅠ—— Victory GO LecturesⅠ—— Victory - 问题 - 软件学院OJ 代码 统计 #include<bits/stdc.h> using namespace std;double b, w;int main() {for(int i 1; i < 19; i ) {for(int j 1; j < 19; j ) {char ch; cin >> ch;if(ch B) b …...

运维大屏与设备仪表盘:打造高效运维管理的视觉中枢

在快速发展的信息化时代&#xff0c;运维行业面临着前所未有的挑战。随着业务规模的不断扩大和系统复杂度的日益增加&#xff0c;如何高效、准确地监控和管理设备运行状态&#xff0c;成为运维团队亟待解决的问题。运维大屏与设备仪表盘作为运维管理的重要工具&#xff0c;为运…...

计算机视觉与医学的结合:推动医学领域研究的新机遇

目录 引言医学领域面临的发文难题计算机视觉与医学的结合&#xff1a;发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉&#xff08;Computer Vision, CV&#xff09;技术作为人工智能的重要分支&#xff0c;已经在多个领域取得了显著的应用成果&…...

使用setsockopt函数SO_BINDTODEVICE异常,Protocol not available

前言 最近在使用OLT的DHCP Server的时候发现一些异常现象&#xff0c;就是ONU发的一个vlan的discover包其他不同vlan的DHCP地址池也会收到&#xff0c;导致其他服务器也发了offer包&#xff0c;ONU同时会有多个ip地址。一开始是没有使用SO_BINDTODEVICE&#xff0c;后面查到使…...

rpm包转deb包或deb包转rpm包

Debian系&#xff08;Ubuntu、Deepin、麒麟Destop等&#xff09;用的安装包是deb的&#xff0c;Red Hat系&#xff08;CentOS、欧拉、麒麟Server等&#xff09;用的安装包是rpm的。 如果需要在Ubuntu上安装rpm&#xff0c;或需要在CentOS上安装deb&#xff0c;需要安装alien s…...

ChatGPT 和文心一言哪个更好用?

ChatGPT vs 文心一言&#xff1a;哪个更好用&#xff1f; 引言 在人工智能蓬勃发展的今天&#xff0c;聊天机器人已经成为我们生活和工作中不可或缺的一部分。你可能听说过ChatGPT和文心一言这两个热门的聊天机器人&#xff0c;它们分别来自OpenAI和百度。那么&#xff0c;究…...

T113-S3 Tina 存储类型修改

前面介绍了如何在 Tina 中添加新的板子&#xff0c;本节介绍如何修改板子存储类型。 1、确定存储类型 Tina 支持多种存储类型&#xff0c;包括 SD 卡、eMMC、SPI NAND、SPI NOR 等。在添加板子之前&#xff0c;需要确定板子使用的存储类型。 存储类型修改 在 device/config/…...

【css】基础(一)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;css专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &a…...

Linux中inode

磁盘的空间管理 如何对磁盘空间进行管理&#xff1f; 假设在一块大小为500G的磁盘中&#xff0c;500*1024*1024524288000KB。在磁盘中&#xff0c;扇区是磁盘的基本单位&#xff08;一般大小为512byte&#xff09;&#xff0c;而文件系统访问磁盘的基本单位是4KB&#xff0c;因…...

verilog fpga 如果if语句==号后面是个表达式 运行不稳定

来自 文心一言 在Verilog中编写FPGA代码时&#xff0c;使用if语句进行条件判断是常见的操作。然而&#xff0c;当if语句中的条件判断使用的是表达式&#xff08;如后面是一个复杂的表达式&#xff09;&#xff0c;确实可能会遇到运行不稳定的问题。这通常是由于以下几个原因导…...

BFS广度优先搜索

广度优先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一种用于遍历或搜索树或图的算法。 它从根节点开始&#xff0c;逐层访问每个节点&#xff0c;并在访问完一层后才访问下一层。BFS常用于寻找最短路径的问题。 下面将用实例一和实例二来实现BFS广度优先搜索 …...

uniapp 自定义导航栏增加首页按钮,仿微信小程序操作胶囊

实现效果如图 抽成组件navbar.vue&#xff0c;放入分包 <template><view class"header-nav-box":style"{height:Props.imgShow?:statusBarHeightpx,background:Props.imgShow?:Props.bgColor||#ffffff;}"><!-- 是否使用图片背景 false…...

小程序项目的基本组成结构

分类介绍 项目根目录下的文件及文件夹 pages文件夹 用来存放所有小程序的页面&#xff0c;其中每个页面都由4个基本文件组成&#xff0c;它们分别是&#xff1a; .js文件&#xff1a;页面的脚本文件&#xff0c;用于存放页面的数据、事件处理函数等 .json文件&#xff1a;…...

2020年国赛高教杯数学建模E题校园供水系统智能管理解题全过程文档及程序

2020年国赛高教杯数学建模 E题 校园供水系统智能管理 原题再现 校园供水系统是校园公用设施的重要组成部分&#xff0c;学校为了保障校园供水系统的正常运行需要投入大量的人力、物力和财力。随着科学技术的发展&#xff0c;校园内已经普遍使用了智能水表&#xff0c;从而可以…...

《C++与 OpenCV 机器学习模块:目标检测的强大融合》

在当今科技飞速发展的时代&#xff0c;目标检测技术已经成为计算机视觉领域的一颗璀璨明珠&#xff0c;广泛应用于安防监控、自动驾驶、智能图像分析等众多领域。而 C语言凭借其高效性和强大的性能&#xff0c;与 OpenCV 的机器学习模块相结合&#xff0c;为实现精准且高效的目…...

函数与模块

目录 1.函数 1.1.函数概念 1.2.函数定义 1.3.函数分类 1.4.函数参数类型 1.4.1.位置参数 1.4.2.关键字参数 1.4.3.默认值参数 1.4.4.可变参数 1.5.匿名函数 1.6.参数传递问题 2.冒泡排序 2.1.冒泡排序规则 2.2.冒泡排序实现 3.math 模块 4.random 模块 5.date…...

SQL面试题——滴滴SQL面试题 取出累计值与1000差值最小的记录

滴滴SQL面试题 取出累计值与1000差值最小的记录 今天的题目来自滴滴出行 已知有表cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 +-----+--------+ | id | money | +-----+--------+ | 1 | 200 | | 2 | 300 …...

使用 Elastic 和 Amazon Bedrock 制作混合地理空间 RAG 应用程序

作者&#xff1a;来自 Elastic Udayasimha Theepireddy (Uday), Srinivas Pendyala, Ayan Ray 借助 Elasticsearch 及其向量数据库&#xff0c;你可以构建可配置的搜索和可信的生成式 AI (GenAI) 体验&#xff0c;这些体验可快速从原型扩展到生产。主要功能包括&#xff1a; 内…...

计算机软著个人申请指南

笔者最近申请了两本软著证书&#xff0c;结合自己的经历介绍一下。 软著登记网址&#xff1a;中国版权业务登记平台 准备工作 你的项目源码源代码统计工具 source-codes-trim&#xff1a;笔者开发自用的源码处理工具vscode插件其他的可以自己在网上搜资源 Word 申请流程 注…...

OmniParser一种用于增强视觉语言模型与用户界面交互效果的技术

OmniParser一种用于增强视觉语言模型与用户界面交互效果的技术 OmniParser的核心功能是将用户界面截图转换为结构化元素&#xff0c;这一过程涉及几个关键步骤和技术要素&#xff0c;解决了视觉语言模型&#xff08;VLMs&#xff09;在与用户界面交互时所面临的多种挑战。 1.…...

HBU深度学习作业10-BPTT

1、推导BPTT 2、推导梯度 3、分析其可能存在梯度爆炸的原因并给出解决方法 为了改善循环神经网络的长程依赖问题&#xff0c;一种非常好的解决方案是在公 式(6.50)的基础上引入门控机制来控制信息的累积速度&#xff0c;包括有选择地加入新 的信息&#xff0c;并有选择地遗忘之…...