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

java 设计模式 策略模式

简介

策略模式(Strategy Pattern)是一种行为设计模式,旨在定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。换句话说,策略模式通过将不同的算法封装成独立的策略类,允许在运行时动态选择不同的策略,而无需修改客户端代码。

策略模式的组成部分

Context(上下文类):上下文类持有一个策略对象,并提供一个接口来让客户端设置或更改策略。上下文通常会在需要时委托策略类来执行具体的算法。

Strategy(策略接口):策略接口定义了一个共同的接口,所有具体策略类都需要实现这个接口。

ConcreteStrategy(具体策略类):具体策略类实现了策略接口,封装了具体的算法或行为。

下面解释最常用的写法

通用实现

场景

例如现在公司在做一个支付平台,需要对接很多家第三方公司,例如支付宝,拉卡拉,通联之类的

第一步定义策略类接口
可以理解为这是对支付的一个策略,因为需要根据客户端创建类型创建不同的支付策略

public interface PaymentStrategy {void pay(double amount);
}

第二步创建具体策略类
例如下面就创建了银行卡支付,支付宝支付,微信支付三个策略类,继承PaymentStrategy接口

// 信用卡支付
public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Using Credit Card to pay: " + amount);}
}// 支付宝支付
public class AlipayPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Using Alipay to pay: " + amount);}
}// 微信支付
public class WeChatPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Using WeChat Pay to pay: " + amount);}
}

第三步创建上下文类,来转发到对应的具体策略类实现,一般来说就是设置策略(向上转型),然后执行支付对应到不同的实现类

public class PaymentContext {private PaymentStrategy paymentStrategy;// 设置策略public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}// 执行支付public void executePayment(double amount) {if (paymentStrategy == null) {System.out.println("No payment strategy set!");return;}paymentStrategy.pay(amount);}
}

第四步客户端调用,这样客户端就只需要创建对应的支付方式就行了

public class Main {public static void main(String[] args) {PaymentContext context = new PaymentContext();// 设置为信用卡支付策略context.setPaymentStrategy(new CreditCardPayment());context.executePayment(100.0);// 设置为支付宝支付策略context.setPaymentStrategy(new AlipayPayment());context.executePayment(200.0);// 设置为微信支付策略context.setPaymentStrategy(new WeChatPayment());context.executePayment(300.0);}
}

简略实现

这里我感觉策略模式实际上就是根据不同的情况,再程序运行的时候动态切换方式
那么有个场景 在登录的时候有多种登录方式,这时候下面这种方式创建的,是不是也是策略模式呢

@Component
public class LoginStrategyFactory {private final Map<Integer, LoginStrategy> strategyMap = new ConcurrentHashMap<>();public LoginStrategyFactory(Map<String, LoginStrategy> strategyMap) {strategyMap.values().forEach(strategy -> this.strategyMap.put(strategy.getLoginType().getLoginType(), strategy));}public LoginStrategy getStrategy(Integer loginType) {return strategyMap.get(loginType);}
} 

这里登录的时候根据客户端传过来的登录类型(账号密码还是短信,或者其他的)来获取不同的对象

    public TokenVO login(LoginRequest loginRequest) {LoginStrategy strategy = loginStrategyFactory.getStrategy(loginRequest.getAuthType());if (Objects.isNull(strategy)) {throw ExFactory.bizException(PaymentError.UNSUPPORTED_AUTH_TYPE);}return loginProcessor.login(loginRequest, strategy);}

相关文章:

java 设计模式 策略模式

简介 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;旨在定义一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。换句话说&#xff0c;策略模式通过将不同的算法…...

游戏盾和高防ip有什么区别

游戏盾和高防IP都是针对网络攻击的防护方案&#xff0c;但​​核心目标、技术侧重点和应用场景存在显著差异​​。以下是两者的详细对比分析&#xff1a; ​​一、核心定位与目标​​ ​​维度​​​​高防IP​​​​游戏盾​​​​核心目标​​抵御大流量网络攻击&#xff08…...

关于 雷达(Radar) 的详细解析,涵盖其定义、工作原理、分类、关键技术、应用场景、挑战及未来趋势,结合实例帮助理解其核心概念

以下是关于 雷达&#xff08;Radar&#xff09; 的详细解析&#xff0c;涵盖其定义、工作原理、分类、关键技术、应用场景、挑战及未来趋势&#xff0c;结合实例帮助理解其核心概念&#xff1a; 一、雷达的定义与核心功能 1. 定义 雷达&#xff08;Radar&#xff0c;Radio D…...

机器学习 Day11 决策树

1.决策树简介 原理&#xff1a;思想源于程序设计的 if - else 条件分支结构 &#xff0c;是一种树形结构。内部节点表示属性判断&#xff0c;分支是判断结果输出&#xff0c;叶节点是分类结果 。案例&#xff1a;以母亲给女儿介绍男朋友为例。女儿依次询问年龄&#xff08;≤3…...

【HFP】深入解析蓝牙 HFP 协议中呼叫转移、呼叫建立及保持呼叫状态的机制

目录 一、核心指令概述 1.1 ATCMER&#xff1a;呼叫状态更新的 “总开关” 1.2 ATBIA&#xff1a;指示器的 “精准控制器” 1.3 指令对比 1.4 指令关系图示 二、CIEV 结果码&#xff1a;状态传递的 “信使” 2.1 工作机制 2.2 三类核心指示器 三、状态转移流程详解 3…...

音频识别优化(FFT)

整合多频段检测、动态阈值调整和持续时长验证的完整代码实现&#xff0c;包含详细注释&#xff1a; #include "esp_dsp.h" #include "driver/i2s.h" #include "esp_log.h" #include "math.h" static const char* TAG "ADV_FRE…...

【Redis】Redis基本命令(1)

KEYS 返回所有满足样式&#xff08;pattern&#xff09;的key。 KEY * 返回所有key&#xff0c;不简易使用 性能问题&#xff1a;当 Redis 存储百万级键时&#xff0c;会消耗大量 CPU 和内存资源&#xff0c;Redis 是单线程模型&#xff0c;KEYS * 执行期间会阻塞其他所有命令…...

IDEA2024 pom.xml依赖文件包报红解决

异常&#xff1a; 原因&#xff1a; 本地的Maven Repository库中不存在对应版本的dependency依赖&#xff0c;所以导致报红。 解决&#xff1a; 方法1&#xff1a;找到对应项目&#xff0c;右键Sync Project 就可以了 方法2&#xff1a;修改setting中maven的自动更新&#xf…...

Qt 信号与槽复习

Qt 信号与槽复习 Qt 信号与槽&#xff08;Signals and Slots&#xff09;机制是 Qt 框架的核心特性之一&#xff0c;用于实现对象之间的通信。它提供了一种松耦合的方式&#xff0c;使得组件可以独立开发和复用&#xff0c;广泛应用于 GUI 编程、事件处理和跨模块交互。本文将…...

RestControllerAdvice 和 ControllerAdvice 两个注解的区别与联系

它们都用于实现全局的通用处理逻辑&#xff0c;主要应用在以下三个方面&#xff1a; 全局异常处理: 使用 ExceptionHandler 注解的方法。全局数据绑定: 使用 InitBinder 注解的方法。全局数据预处理: 使用 ModelAttribute 注解的方法。 联系: 核心功能相同: 两者都提供了上述…...

最快打包WPF 应用程序

在 Visual Studio 中右键项目选择“发布”&#xff0c;目标选“文件夹”&#xff0c;模式选“自包含”&#xff0c;生成含 .exe 的文件夹&#xff0c;压缩后可直接发给别人或解压运行&#xff0c;无需安装任何东西。 最简单直接的新手做法&#xff1a; 用 Visual Studio 的“…...

Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接

什么是Java NIO&#xff1f; Java NIO&#xff08;New Input/Output&#xff09; 是Java 1.4&#xff08;2002年&#xff09;引入的一种非阻塞、面向缓冲区的输入输出框架&#xff0c;旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO&#xff08;java…...

C# 对列表中的元素的多个属性进行排序

目录 前言一、OrderBy、OrderByDescending、ThenBy、ThenByDescending二、Sort 前言 在开发过程中&#xff0c;我们经常需要 根据列表中的元素的某个属性进行排序&#xff0c;下面我们将简单介绍常用的排序函数。 例如此处有一个类&#xff0c;拥有的元素为编号和值 public …...

OpenCV颜色变换cvtColor

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的&#xff0c;但是在进行图像处理时需要用到灰度图、二值图、HSV&#xff08;六角锥体模型&#xff0c;这个模型中颜色的…...

java IO/NIO/AIO

(✪▽✪)曼波~~~~&#xff01;让曼波用最可爱的赛马娘方式给你讲解吧&#xff01;(⁄ ⁄•⁄ω⁄•⁄ ⁄) &#x1f3a0;曼波思维导图大冲刺&#xff08;先看框架再看细节哦&#xff09;&#xff1a; &#x1f4da; 解释 Java 中 IO、NIO、AIO 的区别和适用场景&#xff1a; …...

如何深入理解引用监视器,安全标识以及访问控制模型与资产安全之间的关系

一、核心概念总结 安全标识(策略决策的 “信息载体) 是主体&#xff08;如用户、进程&#xff09;和客体&#xff08;如文件、数据库、设备&#xff09;的安全属性&#xff0c;用于标记其安全等级、权限、访问能力或受保护级别&#xff0c;即用于标识其安全等级、权限范围或约束…...

宜搭与金蝶互通——连接器建立

一、 进入连接器工厂 图1 连接器入口 二、 新建连接器 图2 新建连接器第一步 1、 连接器显示名,如图2中①所示; 2、 图2中②域名,是金蝶系统API接口里面的“完整服务地址”com之前的信息,不含“https”,如图3中①所示; 3、 Base Url通常为“/”,如图2…...

中间件--ClickHouse-7--冷热数据分离,解决Mysql海量数据瓶颈

在web应用中&#xff0c;当数据量非常大时&#xff0c;即使MySQL的存储能够满足&#xff0c;但性能一般也会比较差。此时&#xff0c;可以考虑使用ClickHouse存储历史数据&#xff0c;在Mysql存储最近热点数据的方式&#xff0c;来优化和提升查询性能。ClickHouse的设计初衷就是…...

1.1 设置电脑开机自动用户登录exe开机自动启动

本文介绍两个事情&#xff1a; 1.Windows如何开机自动登录系统&#xff08;不用输密码) 2. 应用程序(.exe)如何开机自动启动 详细解释如下&#xff1a; 一、Windows如何开机自动登录系统&#xff08;不用输密码) 设备上的工控机&#xff0c;如果开机后都需要操作人员输入密码&…...

vscode stm32 variable uint32_t is not a type name 问题修复

问题 在使用vscodekeil开发stm32程序时&#xff0c;发现有时候vscode的自动补全功能失效&#xff0c;且problem窗口一直在报错。variable “uint32_t” is not a type name uint32_t 定义位置 uint32_t 实际是在D:/Keil_v5/ARM/ARMCC/include/stdint.h中定义的。将D:/Keil_v5…...

动态规划与记忆化搜索的区别与联系

记忆化搜索&#xff08;Memoization&#xff09;和动态规划&#xff08;Dynamic Programming, DP&#xff09;都是解决重叠子问题的高效算法技术&#xff0c;但它们有着不同的实现方式和特点。 1. 基本概念 记忆化搜索&#xff08;自顶向下&#xff09; 本质&#xff1a;带有…...

html+js+clickhouse环境搭建

实验背景&#xff1a; 我目前有一台服务器A&#xff0c;和一台主机B&#xff0c;两台设备属于同一局域网&#xff0c;相互之间可以通讯。服务器A中部署着clickhouse&#xff0c;我在主机B中想直接通过javascript代码访问服务器中的clickhouse数据库并获取数据。 ClickHouse 服务…...

生命护航行动再启航!

温州好人陈飞携防溺水课堂&#xff0c;为乡村少年宫筑起安全防线 图文作者&#xff1a;华夏之音/李望 随着夏日热浪的滚滚而来&#xff0c;楠溪江畔的安全警钟再次响起。在这片如诗如画的土地上&#xff0c;一场旨在保护青少年生命安全的防溺水课堂活动拉开了…...

Android Compose Activity 页面跳转动画详解

下面我将全面详细地介绍在 Compose 中实现 Activity 跳转动画的各种方法&#xff0c;包括基础实现、高级技巧和最佳实践。 一、基础 Activity 过渡动画 1. overridePendingTransition 传统方式 这是最基础且兼容性最好的方法&#xff0c;适用于所有 Android 版本。 实现步骤…...

Android启动初始化init.rc详解

1. Android启动与init.rc简介 1.1 Android启动过程 一张图简单阐述一下 &#xff08;网络图片&#xff0c;侵删&#xff09; 1.2 init.rc 简介 Linux的重要特征之一就是一切都是以文件的形式存在的&#xff0c;例如&#xff0c;一个设备通常与一个或多个设备文件对应。这些…...

Linux驱动开发-①regmap②IIO子系统

Linux驱动开发-IIO驱动 一&#xff0c;regmap二&#xff0c;IIO子系统2.1初始化相关工作2.2 通道2.3 读实现 over 一&#xff0c;regmap 对于spi和i2c,读写寄存器的框架不同&#xff0c;但设备本质一样&#xff0c;因此就有了regmap模型来对其进行简化&#xff0c;提供统一的接…...

HTML5好看的水果蔬菜在线商城网站源码系列模板5

文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#…...

L2-033 简单计算器满分笔记

本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示&#xff0c;计算器由两个堆栈组成&#xff0c;一个堆栈 S1​ 存放数字&#xff0c;另一个堆栈 S2​ 存放运算符。计算器的最下方有一个等号键&#xff0c;每次按下这个键&#xff0c;计算器就…...

其他网页正常进入,但是CSDN进入之后排版混乱

显示不正常&#xff0c;排版混乱 解决方法&#xff1a; ①打开网络设置 ②更改适配器 ③所连接的网络 --右键 属性 然后就可以正常访问了。...

BFC详解

1.定义&#xff1a; FC的全称为Formatting Conttext,元素在标准流里面 块级元素的布局属于Block Formatting Context(BFC)——即block level box都是BFC中布局 行内级元素的布局属于Inline Formatting Context (IFC) 2.那么在哪些情况下会创建BFC&#xff1f; 根元素…...

(H3C)vlan配置实验

1.实验拓扑 2.实验配置 [S1]dis cu #version 7.1.070, Alpha 7170 #sysname S1 # vlan 10 # vlan 20 # interface GigabitEthernet1/0/1port link-mode bridgeport link-type trunkport trunk permit vlan 1 10 20combo enable fiber # interface GigabitEthernet1/0/2port li…...

idea mvn执行打包命令后控制台乱码

首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...

JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识

JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep&#xff1a;深度拷贝的比较与基础知识 在 JavaScript 开发中&#xff0c;**深拷贝&#xff08;Deep Copy&#xff09;**是一个常见需求&#xff0c;尤其是在处理复杂对象和嵌套数据结构时。​JSON.parse(JSON.stringify(o…...

搭建用友U9Cloud ERP及UAP IDE环境

应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…...

Linux 系统新磁盘分区XFS挂载

以下是Linux系统中对新硬盘进行XFS文件系统格式化和挂载的完整操作指南&#xff1a; 一、确认硬盘识别 ‌查看已识别硬盘‌ 执行 lsblk 或 fdisk -l 命令&#xff0c;确认新硬盘设备标识&#xff08;如 /dev/sdb&#xff09;‌。 二、硬盘分区&#xff08;可选&#xff09; …...

Oracle测试题目及笔记(单选)

所有题目来自于互联网搜索 当 Oracle 服务器启动时&#xff0c;下列哪种文件不是必须的&#xff08;D&#xff09;。 A&#xff0e;数据文件 B&#xff0e;控制文件 C&#xff0e;日志文件 D&#xff0e;归档日志文件 数据文件、日志文件-在数据库的打开阶段使用 控制文件-在数…...

C语言链接数据库

目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…...

深入浅出 Redis:核心数据结构解析与应用场景Redis 数据结构

引言&#xff1a;Redis 为何如此之快&#xff1f;数据结构是关键 Redis (Remote Dictionary Server) 作为一款高性能的内存键值数据库&#xff0c;凭借其闪电般的速度和丰富的功能&#xff0c;在缓存、消息队列、排行榜等众多场景中得到了广泛应用。除了基于内存存储这一核心优…...

告别昂贵语音合成服务!用GPT-SoVITS生成你的个性化AI语音

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天给大家介绍一款AI语音克隆工具——GPT-SoVITS。这款由花儿不哭大佬开发的工具是一款强大的训练声音模型与音频生成工具…...

前沿要塞:Vue组件安全工程的防御体系重构与技术突围

总章数字世界的钢铁长城 在某个凌晨3点的红蓝对抗演练中&#xff0c;某电商平台因组件级XSS漏洞导致千万级用户数据泄露。这不是虚构的灾难场景&#xff0c;而是2023年某A轮企业的真实遭遇。当传统安全方案在新型攻击面前节节败退时&#xff0c;我们需要为Vue组件铸造全新的数字…...

吴恩达深度学习复盘(19)XGBoost简介|神经网络与决策树

XGBoost 多年来&#xff0c;机器学习研究人员提出了许多构建决策树的方法&#xff0c;目前最常用的方法是对样本或决策树的实现收费。其中&#xff0c;XGBoost 是一种非常快速且易于使用的开源实现&#xff0c;已成功用于赢得许多机器学习竞赛和商业应用。 算法原理 基本思想…...

Docker部署禅道21.6开源版本

将数据库相关环境变量分开&#xff0c;增加注释或空格使得命令更易读。 如果你的 MySQL 主机、端口等配置没有变化&#xff0c;应该确保这些信息是安全的&#xff0c;并考虑使用 Docker secrets 或环境变量配置来避免直接暴露敏感信息。 docker run -d -it --privilegedtrue …...

《MySQL:MySQL表结构的基本操作》

创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c;如果没有指定字符集&#xff0c;则以所在数据…...

C++解析操作mat文件方法-基于vs2019

前言 工作中需要将C#脚本转为C++,所转脚本主要功能是进行mat数据文件的解析和矩阵运算。 1.C#版本 原C#脚本主要是基于 MathNet.Numerics.data.Matlab、MathNet.Numerics.LineAlgebra.Double、 MathNet.Numerics.LineAlgebra 中的MatlabReader、DenseMatrix、Matrix进行mat文…...

OpenCV 模板匹配方法详解

文章目录 1. 什么是模板匹配&#xff1f;2. 模板匹配的原理2.1数学表达 3. OpenCV 实现模板匹配3.1基本步骤 4. 模板匹配的局限性5. 总结 1. 什么是模板匹配&#xff1f; 模板匹配&#xff08;Template Matching&#xff09;是计算机视觉中的一种基础技术&#xff0c;用于在目…...

自已实现一个远程打印方案 解决小程序或APP在外面控制本地电脑打印实现

常规通过小程序或APP在外出时控制本地电脑实现打印功能&#xff0c;可以结合远程桌面技术、云打印服务或开发定制化的远程打印解决方案。 但这里我们采用自已的实现方案来解决 服务器端实现 搭建一个后端socket服务&#xff0c;监听来自手机的打印请求。监听到打印任务后向本…...

Oracle_00000

contents 基本使用 基本使用 Oracle安装后会自动创建sys和system这两个用户。 sys用户&#xff1a;具有最高权限。具有sysdba角色&#xff0c;有create database的权限。该用户默认密码是&#xff1a;manager system用户&#xff1a;管理员用户&#xff0c;具有sysoper角色。没…...

深入剖析 ORM:原理、优缺点、场景及多语言框架示例

ORM 即对象关系映射&#xff08;Object Relational Mapping&#xff09;&#xff0c;它是一种编程技术&#xff0c;其作用是在面向对象编程语言里&#xff0c;把对象模型和关系型数据库的数据结构之间创建起映射&#xff0c;这样开发者就能够使用面向对象的方式来操作数据库&am…...

ARINC818协议-持续

一、帧头帧尾 SOF 和 EOF 分别代表视频帧传输的开始与结束&#xff0c;它们在封装过程有多种状态&#xff0c;SOF 分为 SOFi 和 SOFn&#xff0c;EOF 分为 EOFt 和 EOFn。传输系统中的视频信息包括像素数据信 息和辅助数据信息&#xff0c;分别存储在有效数据中的对象 0 和对象…...

【uniapp】uni.setClipboardData 方法失效 bug 解决方案

写了一个 copy 方法&#xff0c;但是怎么也没有弹窗复制成功 <text click"toCopy(myInfo.id)">复制 </text> 逐步打印发现 1 正常打印&#xff0c;2 没有打印&#xff0c;说明问题出现在 setClipboardData 方法执行中 toCopy(n) {// console.log(1,ty…...