深度解析策略模式:从理论到企业级实战应用
一、策略模式的本质:面向接口的算法工厂
策略模式(Strategy Pattern)是行为型设计模式的典型代表,其核心思想是将算法族抽象为独立对象,使其能够相互替换。这种模式完美体现了以下面向对象设计原则:
-
开闭原则(OCP):新增策略无需修改已有代码
-
单一职责原则(SRP):每个策略只负责特定算法
-
依赖倒置原则(DIP):高层模块依赖抽象而非具体实现
UML类图:

二、策略模式的三种典型实现方式
1. 基础版实现(传统方式)
// 策略接口
public interface DiscountStrategy {BigDecimal calculateDiscount(BigDecimal amount);
}// 具体策略
public class VipDiscount implements DiscountStrategy {@Overridepublic BigDecimal calculateDiscount(BigDecimal amount) {return amount.multiply(new BigDecimal("0.8"));}
}public class FestivalDiscount implements DiscountStrategy {@Overridepublic BigDecimal calculateDiscount(BigDecimal amount) {return amount.subtract(new BigDecimal("50"));}
}// 上下文环境
public class OrderContext {private DiscountStrategy strategy;public void setStrategy(DiscountStrategy strategy) {this.strategy = strategy;}public BigDecimal executeDiscount(BigDecimal amount) {return strategy.calculateDiscount(amount);}
}
2. 枚举策略(简化分支判断)
public enum CalculatorStrategy {ADD {@Overridepublic int execute(int a, int b) { return a + b; }},SUBTRACT {@Overridepublic int execute(int a, int b) { return a - b; }};public abstract int execute(int a, int b);
}
3. Spring集成版(企业级实践)
// 定义策略接口
public interface PaymentStrategy {void processPayment(BigDecimal amount);
}// 实现策略(带Spring注解)
@Component("alipayStrategy")
public class AlipayStrategy implements PaymentStrategy {@Overridepublic void processPayment(BigDecimal amount) {// 支付宝支付逻辑}
}@Component("wechatPayStrategy")
public class WechatPayStrategy implements PaymentStrategy {@Overridepublic void processPayment(BigDecimal amount) {// 微信支付逻辑}
}// 策略上下文(自动注入策略集合)
@Service
public class PaymentContext {@Autowiredprivate Map<String, PaymentStrategy> strategyMap;public void executePayment(String paymentType, BigDecimal amount) {PaymentStrategy strategy = strategyMap.get(paymentType + "Strategy");if (strategy != null) {strategy.processPayment(amount);} else {throw new IllegalArgumentException("Unsupported payment type");}}
}
三、策略模式的六大应用场景
场景1:电商促销系统
-
满减策略
-
折扣策略
-
赠品策略
-
积分抵现策略
场景2:支付网关路由
-
支付宝支付
-
微信支付
-
银联支付
-
数字货币支付
场景3:日志处理系统
-
本地文件存储
-
云存储(OSS/S3)
-
消息队列转发
-
数据库存储
场景4:数据校验引擎
-
手机号校验
-
身份证校验
-
邮箱校验
-
地址校验
场景5:游戏AI系统
-
攻击策略
-
防御策略
-
逃跑策略
-
补给策略
场景6:报表生成系统
-
PDF生成
-
Excel生成
-
HTML生成
-
CSV生成
四、策略模式与相关模式的深度对比
| 模式 | 关注点 | 与策略模式的关系 |
|---|---|---|
| 工厂模式 | 对象创建 | 策略模式常配合工厂创建具体策略 |
| 状态模式 | 状态转换 | 状态改变行为,策略改变算法 |
| 模板方法模式 | 算法步骤 | 策略替换整个算法,模板方法替换步骤 |
| 命令模式 | 请求封装 | 策略是主动选择,命令是被动触发 |
五、企业级实战:支付系统策略架构设计
架构图
复制
[支付请求] --> [支付网关]↓[策略路由中心]↓ +----------------+----------------+ | 支付宝策略 | 微信支付策略 | 银联策略 +----------------+----------------+↓[渠道适配层]↓[第三方支付平台]
代码实现(Spring Boot +策略模式)
java
复制
// 支付策略接口
public interface PaymentStrategy {PaymentResult pay(PaymentRequest request);
}// 支付宝策略实现
@Component
public class AlipayStrategy implements PaymentStrategy {@Override@PaymentType(PayChannel.ALIPAY)public PaymentResult pay(PaymentRequest request) {// 调用支付宝SDKreturn new PaymentResult(true, "ALIPAY-123456");}
}// 策略工厂(自动发现策略)
@Component
public class PaymentStrategyFactory {@Autowiredprivate Map<String, PaymentStrategy> strategyMap;public PaymentStrategy getStrategy(PayChannel channel) {return strategyMap.values().stream().filter(s -> s.getClass().isAnnotationPresent(PaymentType.class)).filter(s -> s.getClass().getAnnotation(PaymentType.class).value() == channel).findFirst().orElseThrow(() -> new RuntimeException("未找到支付策略"));}
}// 支付服务
@Service
@RequiredArgsConstructor
public class PaymentService {private final PaymentStrategyFactory strategyFactory;public PaymentResult processPayment(PaymentRequest request) {PaymentStrategy strategy = strategyFactory.getStrategy(request.getChannel());return strategy.pay(request);}
}
六、策略模式的五个优化技巧
1. 策略预热缓存
public class StrategyCache {private static final Map<String, Strategy> cache = new ConcurrentHashMap<>();public static Strategy getStrategy(String type) {return cache.computeIfAbsent(type, t -> {// 动态加载策略类try {return (Strategy) Class.forName(t).newInstance();} catch (Exception e) {throw new RuntimeException("策略加载失败");}});}
}
2. 策略权重配置
# application.yml payment:strategies:alipay: weight: 60enable: truewechat: weight: 30 enable: trueunionpay: weight: 10enable: false
3. 策略性能监控
public class MonitoredStrategy implements Strategy {private final Strategy delegate;private final MeterRegistry registry;public MonitoredStrategy(Strategy delegate, MeterRegistry registry) {this.delegate = delegate;this.registry = registry;}@Overridepublic void execute() {Timer.Sample sample = Timer.start(registry);try {delegate.execute();} finally {sample.stop(registry.timer("strategy.execution.time", "type", delegate.getClass().getSimpleName()));}}
}
七、常见陷阱与解决方案
| 陷阱 | 现象 | 解决方案 |
|---|---|---|
| 策略状态共享 | 线程安全问题 | 使用ThreadLocal或每次新建策略实例 |
| 策略膨胀失控 | 类数量爆炸 | 使用DSL动态生成策略类 |
| 策略切换开销大 | 频繁切换影响性能 | 引入策略缓存池 |
| 策略配置错误 | 运行时找不到策略 | 增加策略fallback机制 |
| 策略执行顺序依赖 | 策略之间存在依赖关系 | 引入策略责任链模式 |
相关文章:
深度解析策略模式:从理论到企业级实战应用
一、策略模式的本质:面向接口的算法工厂 策略模式(Strategy Pattern)是行为型设计模式的典型代表,其核心思想是将算法族抽象为独立对象,使其能够相互替换。这种模式完美体现了以下面向对象设计原则: 开闭原…...
【Linux】深入理解linux权限
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、权限是什么 二、用户和身份角色 三、文件属性 1. 文件属性表示 2. 文件类型 3. 文件的权限属性 四、修改文件的权限属性和角色 1. …...
C++STL(六)——list模拟
目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…...
网络安全与AI:数字经济发展双引擎
在2025年年初,一场科技攻防战引发了全球关注。国产人工智能DeepSeek的爆火,伴随着大规模的网络攻击事件,将网络安全的重要性推上了风口浪尖。 在此背景下,我们计划探讨网络安全与人工智能如何为数字经济发展提供强大动力。网络安…...
WPS接入DeepSeek模型
1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 (最好是安装最新的wps) 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…...
深度学习之神经网络框架搭建及模型优化
神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…...
采用分步式无线控制架构实现水池液位自动化管理
以下是基于巨控GRM241Q-4D4I4QHE模块的完整技术方案,采用分步式无线控制架构实现水池液位自动化管理: 一、系统架构设计 硬件部署 山顶单元 GRM241Q模块(带4G功能) 液位计(4-20mA) 功能:实时采…...
OpenEuler学习笔记(二十三):在OpenEuler上部署开源MES系统
在OpenEuler上部署小企业开源MES(制造执行系统,Manufacturing Execution System)是一个非常有价值的项目,可以帮助企业实现生产过程的数字化管理。以下是基于开源MES系统(如 Odoo MES 或 OpenMES)的部署步骤…...
SpringSecurity:授权服务器与客户端应用(入门案例)
文章目录 一、需求概述二、基本授权登录功能实现1、授权服务器开发2、客户端开发3、功能测试 三、自定义授权服务器登录页1、授权服务器开发2、功能测试 四、自定义授权服务器授权页1、授权服务器开发2、功能测试 五、客户端信息保存数据库1、授权服务器开发2、功能测试 一、需…...
没用的文章又➕1
次次登陆GitHub都让我抓心挠肝,用了热度最高的法子也不抵事儿。谁说github上全是大神了,也要有我这样的小菜鸟。下面是我的失败记录… 查询目标网站的DNS 在whois上输入目标网站github.com,在查询结果当中选取任意一个DNS将地址和名称添加在…...
BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)
代码地址:BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据) BiGRU双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景和意义 随着全球对可再生能源需求的不断增长,光伏…...
谷歌浏览器多开指南:如何完成独立IP隔离?
对于跨境电商来说,在进行社交媒体营销、广告投放等业务活动时,往往需要同时登录多个账号来提高运营效率和提升营销效果。然而,如果这些账号共享相同的 IP 地址,很容易被平台检测为关联账号,进而触发安全验证甚至封禁。…...
Django开发入门 – 3.用Django创建一个Web项目
Django开发入门 – 3.用Django创建一个Web项目 Build A Web Based Project With Django By JacksonML 本文简要介绍如何利用最新版Python 3.13.2来搭建Django环境,以及创建第一个Django Web应用项目,并能够运行Django Web服务器。 创建该Django项目需…...
【Java】多线程和高并发编程(三):锁(下)深入ReentrantReadWriteLock
文章目录 4、深入ReentrantReadWriteLock4.1 为什么要出现读写锁4.2 读写锁的实现原理4.3 写锁分析4.3.1 写锁加锁流程概述4.3.2 写锁加锁源码分析4.3.3 写锁释放锁流程概述&释放锁源码 4.4 读锁分析4.4.1 读锁加锁流程概述4.4.1.1 基础读锁流程4.4.1.2 读锁重入流程4.4.1.…...
讲解ES6中的变量和对象的解构赋值
在 ES6 中,解构赋值是一种非常方便的语法,它使得从数组或对象中提取值变得更加简洁和直观。解构赋值支持变量赋值,可以通过单独提取数组或对象的元素来赋值给变量。 下面我将分别讲解 数组解构 和 对象解构 的基本用法和一些高级特性。 1. …...
DeepSeek Coder + IDEA 辅助开发工具
开发者工具 我之前用的是Codegeex4模型,现在写一款DeepSeek Coder 本地模型 DeepSeek为什么火,我在网上看到一个段子下棋DeepSeek用兵法赢了ChatGpt,而没有用技术赢,这就是AI的思维推理,深入理解孙子兵法,…...
云计算——AWS Solutions Architect – Associate(saa)4.安全组和NACL
安全组一充当虚拟防火墙对于关联实例,在实例级别控制入站和出站流量。 网络访问控制列表(NACL)一充当防火墙关联子网,在子网级别控制入站和出站流量。 在专有网络中,安全组和网络ACL(NACL)一起帮助构建分层网络防御。 安全组在实例级别操作…...
动量+均线组合策略关键点
动量均线组合策略关键点: 趋势确认: MA系统判断主趋势方向动量指标判断趋势强度 入场条件: 价格站上重要均线(如20日线)动量指标向上并保持高位短期均线上穿长期均线 出场条件: 价格跌破均线系统动量指标见顶回落短期均线下…...
Blazor-<select>
今天我们来说说<select>标签的用法,我们还是从一个示例代码开始 page "/demoPage" rendermode InteractiveAuto inject ILogger<InjectPage> logger; <h3>demoPage</h3> <select multiple>foreach (var item in list){<…...
Synchronized使用
文章目录 synchronized使用基本概念使用方法实现原理锁的粒度并发编程注意事项与Lock锁对比比较线程安全性与性能 synchronized使用 当涉及到多线程编程时,保证数据的正确性和一致性是至关重要的。而synchronized关键字是Java语言中最基本的同步机制之一࿰…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
