深度解析策略模式:从理论到企业级实战应用
一、策略模式的本质:面向接口的算法工厂
策略模式(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语言中最基本的同步机制之一࿰…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
【Linux】使用1Panel 面板让服务器定时自动执行任务
服务器就是一台24小时开机的主机,相比自己家中不定时开关机的主机更适合完成定时任务,例如下载资源、备份上传,或者登录某个网站执行一些操作,只需要编写 脚本,然后让服务器定时来执行这个脚本就可以。 有很多方法实现…...
