首页/新闻资讯/正文详情

【设计模式之美】策略模式方法论:解耦策略的定义、创建和使用

发布时间:2026/11/3 1:16:10 来源:云帆数科 栏目:资讯中心
【设计模式之美】策略模式方法论:解耦策略的定义、创建和使用
文章目录一. 策略的定义-封装策略面向接口二. 策略的创建-创建策略工厂1. 对于无状态策略2. 对于有状态策略三. 策略的使用动态选择四. 避免分支判断-策略的优雅1. 对于无状态的策略2. 对于有状态的策略策略模式是定义一族算法类将每个算法分别封装起来让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端这里的客户端代指使用算法的代码。它解耦的是策略的定义、创建、使用这三部分。接下来我们看一下这三个部分的逻辑与要解决的问题一. 策略的定义-封装策略面向接口策略类的定义比较简单包含一个策略接口和一组实现这个接口的策略类。它是面向接口编程所以可以灵活替换不同的策略。public interface Strategy { void algorithmInterface(); } public class ConcreteStrategyA implements Strategy { Override public void algorithmInterface() { //具体的算法... } } public class ConcreteStrategyB implements Strategy { Override public void algorithmInterface() { //具体的算法... } }二. 策略的创建-创建策略工厂策略模式会包含一组策略具体使用哪个策略可以通过type来选定。我们可以把一组策略放到放到工厂类。1. 对于无状态策略策略模式是否有状态如果策略类是无状态的不包含成员变量只是纯粹的算法实现这样的策略对象是可以被共享使用的不需要在每次调用 getStrategy() 的时候都创建一个新的策略对象。即如上我们提前创建好每个策略对象缓存到工厂类中用的时候直接返回。publicclassStrategyFactory{privatestaticfinalMapString,StrategystrategiesnewHashMap();static{strategies.put(A,newConcreteStrategyA());strategies.put(B,newConcreteStrategyB());}publicstaticStrategygetStrategy(Stringtype){...check somereturnstrategies.get(type);}}2. 对于有状态策略如果策略类是有状态的每次获取工厂中获取的策略都是新的策略对象。那可以如下创建publicclassStrategyFactory{publicstaticStrategygetStrategy(Stringtype){if(typenull||type.isEmpty()){thrownewIllegalArgumentException(type should not be empty.);}if(type.equals(A)){returnnewConcreteStrategyA();}elseif(type.equals(B)){returnnewConcreteStrategyB();}returnnull;}}三. 策略的使用动态选择选定某一策略一般根据业务逻辑动态的选定某一个策略。// 策略接口EvictionStrategy// 策略类LruEvictionStrategy、FifoEvictionStrategy、LfuEvictionStrategy...// 策略工厂EvictionStrategyFactorypublicclassUserCache{privateMapString,UsercacheDatanewHashMap();privateEvictionStrategyeviction;publicUserCache(EvictionStrategyeviction){this.evictioneviction;}//...}// 运行时动态确定根据配置文件的配置决定使用哪种策略publicclassApplication{publicstaticvoidmain(String[]args)throwsException{EvictionStrategyevictionStrategynull;PropertiespropsnewProperties();props.load(newFileInputStream(./config.properties));Stringtypeprops.getProperty(eviction_type);evictionStrategyEvictionStrategyFactory.getEvictionStrategy(type);UserCacheuserCachenewUserCache(evictionStrategy);//...}}//或者直接根据type动态选择四. 避免分支判断-策略的优雅能够移除分支判断逻辑的模式不仅仅有策略模式状态模式也可以。如下判断分支publicclassOrderService{publicdoublediscount(Orderorder){doublediscount0.0;OrderTypetypeorder.getType();if(type.equals(OrderType.NORMAL)){// 普通订单//...省略折扣计算算法代码}elseif(type.equals(OrderType.GROUPON)){// 团购订单//...省略折扣计算算法代码}elseif(type.equals(OrderType.PROMOTION)){// 促销订单//...省略折扣计算算法代码}returndiscount;}}1. 对于无状态的策略对上面的代码重构将不同的逻辑设计成策略类并由工厂类来负责创建策略对象。然后通过map码表来动态选择策略。这样就没有了 if-else 分支判断语句了。// 策略的定义publicinterfaceDiscountStrategy{doublecalDiscount(Orderorder);}// 省略NormalDiscountStrategy、GrouponDiscountStrategy、PromotionDiscountStrategy类代码...// 策略的创建publicclassDiscountStrategyFactory{privatestaticfinalMapOrderType,DiscountStrategystrategiesnewHashMap();static{strategies.put(OrderType.NORMAL,newNormalDiscountStrategy());strategies.put(OrderType.GROUPON,newGrouponDiscountStrategy());strategies.put(OrderType.PROMOTION,newPromotionDiscountStrategy());}publicstaticDiscountStrategygetDiscountStrategy(OrderTypetype){returnstrategies.get(type);}}// 策略的使用publicclassOrderService{publicdoublediscount(Orderorder){OrderTypetypeorder.getType();DiscountStrategydiscountStrategyDiscountStrategyFactory.getDiscountStrategy(type);returndiscountStrategy.calDiscount(order);}}2. 对于有状态的策略对于有状态的策略将判断逻辑放到了工厂类中publicclassDiscountStrategyFactory{publicstaticDiscountStrategygetDiscountStrategy(OrderTypetype){if(typenull){thrownewIllegalArgumentException(Type should not be null.);}if(type.equals(OrderType.NORMAL)){returnnewNormalDiscountStrategy();}elseif(type.equals(OrderType.GROUPON)){returnnewGrouponDiscountStrategy();}elseif(type.equals(OrderType.PROMOTION)){returnnewPromotionDiscountStrategy();}returnnull;}}参考《设计模式之美》–王争

相关推荐

【python基础】基本数据类型
【python基础】基本数据类型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:16:10

ComfyUI WanVideo模型仓库:一站式AI视频生成模型集合与部署指南
ComfyUI WanVideo模型仓库:一站式AI视频生成模型集合与部署指南

ComfyUI WanVideo模型仓库:一站式AI视频生成模型集合与部署指南 在AI视频生成技术快速发展的今天,WanVideo作为业界领先的视频生成框架,为创作者提供了强大的文本到视频(T2V)、图像到视频(I2V)… · 2026/11/3 1:15:10

性能对比:NVIDIA-Nemotron-3-Ultra在BF16与NVFP4模式下的基准测试结果
性能对比:NVIDIA-Nemotron-3-Ultra在BF16与NVFP4模式下的基准测试结果

性能对比:NVIDIA-Nemotron-3-Ultra在BF16与NVFP4模式下的基准测试结果 NVIDIA-Nemotron-3-Ultra-550B-A55B-NVFP4是一款由NVIDIA开发的前沿级大型语言模型(LLM),旨在提供强大的智能代理、推理和对话能力。该模型采用混合Latent M… · 2026/11/3 1:15:10

Instant-NuRec安全与伦理考量:在自动驾驶仿真中的责任使用指南
Instant-NuRec安全与伦理考量:在自动驾驶仿真中的责任使用指南

Instant-NuRec安全与伦理考量:在自动驾驶仿真中的责任使用指南 Instant-NuRec作为一款高效的图像转3D高斯模型,在自动驾驶仿真场景构建中展现出显著价值。它能在2分钟内将多视角图像转换为高精度3D高斯点云,为自动驾驶算法测试提供关键场景素… · 2026/11/3 1:40:16

Qwen3-VL-32B Ultra Heretic模型验证指南:确保张量结构与量化质量
Qwen3-VL-32B Ultra Heretic模型验证指南:确保张量结构与量化质量

Qwen3-VL-32B Ultra Heretic模型验证指南:确保张量结构与量化质量 Qwen3-VL-32B Ultra Heretic模型是一款针对ComfyUI优化的图像文本生成模型,提供BF16和INT8 ConvRot等多种量化格式,确保在不同硬件环境下的高效运行。本指南将详细介绍如何验… · 2026/11/3 1:40:16

Youtu-LLM-2B-Base:如何用20亿参数解决边缘AI智能代理部署难题
Youtu-LLM-2B-Base:如何用20亿参数解决边缘AI智能代理部署难题

Youtu-LLM-2B-Base:如何用20亿参数解决边缘AI智能代理部署难题 在AI模型部署的实践中,企业面临着一个关键矛盾:大型语言模型提供强大能力但计算成本高昂,小型模型部署轻便但智能代理能力不足。腾讯Youtu-LLM-2B-Base以1.96亿参数规… · 2026/11/3 1:40:16

BFS-Best-Face-Swap版本对比:从V1到V5,哪个AI换脸模型最适合你的需求?
BFS-Best-Face-Swap版本对比:从V1到V5,哪个AI换脸模型最适合你的需求?

BFS-Best-Face-Swap版本对比:从V1到V5,哪个AI换脸模型最适合你的需求? 在AI图像编辑领域,高质量的面部交换技术一直是创作者和开发者关注的焦点。BFS(Best Face Swap)系列LoRA模型为Qwen Image Edit 2509/2… · 2026/11/3 1:40:16

4240亿参数多模态巨兽开源!ERNIE 4.5重构AI产业格局
4240亿参数多模态巨兽开源!ERNIE 4.5重构AI产业格局

4240亿参数多模态巨兽开源!ERNIE 4.5重构AI产业格局 导语:效率革命来了!ERNIE 4.5以异构MoE架构突破大模型落地瓶颈 2025年AI产业最重磅事件——百度ERNIE 4.5系列大模型正式开源!这个包含从0.3B到424B参数量的10款模型家族&… · 2026/11/3 1:40:16

netboot.xyz 网络启动故障排除指南:从通电到装机的完整排障路线
netboot.xyz 网络启动故障排除指南:从通电到装机的完整排障路线

netboot.xyz 网络启动故障排除指南:从通电到装机的完整排障路线 【免费下载链接】netboot.xyz Your favorite operating systems in one place. A network-based bootable operating system installer based on iPXE. 项目地址: https://gitcode.com/gh_mirrors/n… · 2026/11/3 1:39:16

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 4:42:45

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 5:17:18

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码