【架构-设计模式】----一篇文章搞定策略模式,轻松易懂
一篇文章搞定策略模式轻松易懂一、什么是策略模式策略模式Strategy Pattern定义一系列可互换的算法策略把每个算法封装成独立类让算法和使用算法的代码解耦算法可以动态替换。核心一句话同一个行为有多种不同实现可以随时切换不用大量if/else。适用场景一堆if-else/switch分支还会不断新增。角色拆解3个策略接口 Strategy统一规范所有策略的方法具体策略 ConcreteStrategy实现接口每种算法单独写一个类上下文 Context持有策略对象对外提供调用入口负责使用策略二、举个生活化例子场景商场结算不同会员折扣不一样普通会员无折扣银卡会员9折金卡会员8折以后还可能新增钻石会员、限时折扣。❌ 坏写法大量if elsepublicdoublecalcPrice(doubleoriginPrice,StringmemberType){if(普通.equals(memberType)){returnoriginPrice;}elseif(银卡.equals(memberType)){returnoriginPrice*0.9;}elseif(金卡.equals(memberType)){returnoriginPrice*0.8;}returnoriginPrice;}缺点新增折扣要改这个方法违反开闭原则if越来越臃肿。✅ 策略模式改造1. 策略接口// 折扣策略接口publicinterfaceDiscountStrategy{// 计算折扣后价格doublegetPrice(doubleoriginPrice);}2. 具体策略类// 普通会员publicclassNormalStrategyimplementsDiscountStrategy{OverridepublicdoublegetPrice(doubleoriginPrice){returnoriginPrice;}}// 银卡9折publicclassSilverStrategyimplementsDiscountStrategy{OverridepublicdoublegetPrice(doubleoriginPrice){returnoriginPrice*0.9;}}// 金卡8折publicclassGoldStrategyimplementsDiscountStrategy{OverridepublicdoublegetPrice(doubleoriginPrice){returnoriginPrice*0.8;}}3. Context上下文负责持有策略对外提供服务publicclassPriceContext{// 持有策略privateDiscountStrategystrategy;// 构造传入策略publicPriceContext(DiscountStrategystrategy){this.strategystrategy;}// 动态更换策略publicvoidsetStrategy(DiscountStrategystrategy){this.strategystrategy;}// 执行计算publicdoublecalc(doubleoriginPrice){returnstrategy.getPrice(originPrice);}}4. 客户端调用publicclassTest{publicstaticvoidmain(String[]args){// 原价1000doubleprice1000;// 金卡结算PriceContextcontextnewPriceContext(newGoldStrategy());System.out.println(context.calc(price));// 800.0// 动态切换成银卡context.setStrategy(newSilverStrategy());System.out.println(context.calc(price));//900.0}}新增钻石会员只需要新建DiamondStrategy实现接口不用修改原有代码满足开闭原则。三、UML简图文字版DiscountStrategy(接口) ↑ ┌────┬────┬────┐ Normal Silver Gold ↑ PriceContext 持有 DiscountStrategy四、优缺点✅ 优点消除大量if/else、switch算法独立方便单元测试策略可动态切换新增策略不改动旧代码符合开闭原则❌ 缺点策略增多类数量膨胀每一个策略都要新建类客户端需要理解各个策略差异才能选择合适策略五、Java里的实际使用java.util.Comparator就是典型策略接口Collections.sort(list, Comparator)第二个参数就是不同排序策略可以随时更换。线程池拒绝策略RejectedExecutionHandlerAbort、Discard、CallerRuns 都是策略。六、策略模式 VS 简单工厂容易混淆策略侧重行为算法的动态替换算法可运行时切换上下文持有策略简单工厂侧重对象创建根据参数帮你new出对象一般一次性获取经常组合使用工厂 策略工厂根据类型生产对应的策略对象客户端不用自己new策略。七、Lambda简化Java8优化减少类爆炸策略是函数式接口可以不用写一堆策略类直接传lambda// 接口上加 FunctionalInterfaceFunctionalInterfacepublicinterfaceDiscountStrategy{doublegetPrice(doubleoriginPrice);}// 调用PriceContextctxnewPriceContext(p-p*0.7);System.out.println(ctx.calc(1000));适合简单策略复杂策略逻辑多还是单独拆类。八、什么时候选策略模式满足下面任意一条就可以考虑同一个业务多种算法/方案需要互相替换代码充斥大量if else后续分支还会持续增加希望把算法独立出来单独管理、单独测试

相关新闻

TuriX Skills技能系统教程:用Markdown手册教会“数字牛马“点星GitHub(附可直接套用的模板)

TuriX Skills技能系统教程:用Markdown手册教会“数字牛马“点星GitHub(附可直接套用的模板)

TuriX Skills技能系统教程:用Markdown手册教会"数字牛马"点星GitHub(附可直接套用的模板) 【免费下载链接】TuriX-CUA This is the official website for TuriX Computer-use-Agent 项目地址: https://gitcode.com/gh_mirrors/tu…

2026/9/30 13:29:18 阅读更多 →
LLM 应用开发必修课:彻底搞懂 Positional Encoding / Position Embedding

LLM 应用开发必修课:彻底搞懂 Positional Encoding / Position Embedding

为什么 Transformer 明明能“看见”整个上下文,却不知道谁在前、谁在后? 从 Sinusoidal Position Encoding,到 Learned Position Embedding,再到如今 LLaMA、Qwen 等模型广泛采用的 RoPE,位置编码经历了一次非常有代表性的演进。 对 LLM 应用开发者来说,理解位置编码并不…

2026/9/30 13:28:15 阅读更多 →
音游谱面解析与本地可视化调试:JSON、判定区间与配乐对齐

音游谱面解析与本地可视化调试:JSON、判定区间与配乐对齐

音游谱面不只是“按节奏点”:我用一套本地工具链解析「MuseDashAP Lv.3」的谱面 JSON、判定区间与 FM 电台式配乐对齐 第一次看到“MuseDashAP Lv.3 暮色電台 FM103 - Baby Pink”这个标题,很多人的第一反应是“这又是一首音游 BGM 的视频”。但这篇要聊…

2026/9/30 13:28:15 阅读更多 →

最新新闻

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/1 0:00:30 阅读更多 →
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/1 0:00:30 阅读更多 →
游戏引擎原理与实践 02:揭开3A游戏背后的技术面纱

游戏引擎原理与实践 02:揭开3A游戏背后的技术面纱

游戏引擎原理与实践 02:揭开3A游戏背后的技术面纱Bilibili 同步视频游戏逻辑 vs 游戏引擎,剧本和摄影机的区别现代游戏引擎都包含哪些模块?游戏编辑器:游戏开发者的工作台数学,游戏引擎的内功根基需要重点掌握的数学知…

2026/9/30 23:59:29 阅读更多 →
中科院青藏高原所李新团队提出 READY 框架|地学数据光“开放共享”还不够,得先过“AI 就绪”这道关

中科院青藏高原所李新团队提出 READY 框架|地学数据光“开放共享”还不够,得先过“AI 就绪”这道关

近日,中国科学院青藏高原研究所、国家青藏高原科学数据中心联合国内多个地学数据中心科研人员,系统提出了“人工智能就绪地球科学数据(AI-ready geoscience data)”的定义框架与实现路径。当前,“人工智能就绪数据&…

2026/9/30 23:59:29 阅读更多 →
智能车竞赛芯片选型指南:从主频、资源到双核与生态的决策链

智能车竞赛芯片选型指南:从主频、资源到双核与生态的决策链

1. 为什么第十五届的“芯片选型”忽然成了所有人绕不开的话题从第十五届备赛周期开始,智能车竞赛里的一个趋势变得非常明显:你打开官方通知后,第一件事不再是去翻上届学长传下来的代码,而是先去看“主控芯片”那一栏还能不能沿用老…

2026/9/30 23:59:29 阅读更多 →
MCP Kubernetes Server 实战:用 TaoToken 统一 Key 打通集群管理工具链

MCP Kubernetes Server 实战:用 TaoToken 统一 Key 打通集群管理工具链

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

2026/9/30 23:59:29 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/1 0:00:30 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/1 0:00:30 阅读更多 →