新闻详情

新闻详情

首页 / 资讯中心 / 详情

【架构-设计模式】----一篇文章搞定策略模式,轻松易懂

发布时间:2026/9/30 13:29:13来源:尧图网络
【架构-设计模式】----一篇文章搞定策略模式,轻松易懂
一篇文章搞定策略模式轻松易懂一、什么是策略模式策略模式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后续分支还会持续增加希望把算法独立出来单独管理、单独测试
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【毕设避坑干货】挑选 AI 论文工具必看!一站式平台 Paperxie 实测分享 2026/9/30 14:57:07

【毕设避坑干货】挑选 AI 论文工具必看!一站式平台 Paperxie 实测分享

前言 临近毕业季,网上层出不穷的 AI 论文工具让人眼花缭乱。很多同学随便找一个网站就开始写论文,等到后期才发现功能不全、参考文献造假、文稿泄露等一系列问题,白白浪费大量时间。 挑选 AI 论文辅助工具,核心要看两点&#xf…

阅读更多 →
论文投稿前要自查哪些学术规范:署名、利益冲突与伦理声明逐项核对手册 2026/9/30 14:56:59

论文投稿前要自查哪些学术规范:署名、利益冲突与伦理声明逐项核对手册

在投稿系统点下"提交"的前一刻,多数人盯的是重复率和字数,而编辑在送外审之前逐条核对的是另一组信息:名字怎么排、有没有未说明的利益关系、涉及人的研究有没有伦理依据。这几处含糊的稿件,常在初审阶段被退回补正&…

阅读更多 →
WSL从安装到VS Code开发的全流程实践与踩坑记录 2026/9/30 14:56:48

WSL从安装到VS Code开发的全流程实践与踩坑记录

说实话,“配置WSL并在vscode里打开”这个标题看起来属于“十分钟入门”级别,但真正上手操作的时候,翻车的情况比想象中多得多。我从第一次在Windows上搭Linux开发环境到现在,反复折腾过WSL的安装、迁移、崩溃恢复、VS Code连接这些…

阅读更多 →
OpenStack Nova 16种核心操作全解析:从状态机到运维实战 2026/9/30 14:56:34

OpenStack Nova 16种核心操作全解析:从状态机到运维实战

1. 为什么说 Nova 的操作比你想的多得多 做过 OpenStack 运维的人都有这种体会:Nova 表面上是“管虚拟机”的组件,但真正上手之后才发现,它那套操作体系的复杂度远超预期。单说对一个 instance 的管理,官方 API 文档里列出的动作就…

阅读更多 →
尚硅谷Java教程笔记之变量与运算符 2026/9/30 14:55:45

尚硅谷Java教程笔记之变量与运算符

文章前言: 本文是笔者在学习的时候边学边敲,可能有疏忽,我们一起进步 ##1.关键字(在Java中严肃区分大小写,在任何场景下) 被赋予了专门的含义与用途 保留关键字是指目前官方先行占用这个作为关键字&#xf…

阅读更多 →
Linux内存泄漏排查实战:perf、Valgrind与Heap Profiler的递进用法 2026/9/30 14:55:26

Linux内存泄漏排查实战:perf、Valgrind与Heap Profiler的递进用法

内存泄漏这种问题,放到生产环境里基本都是先闹一段“越来越慢”“内存见底”“重启就好”的幺蛾子,然后大家才被迫认真查。查的时间往往比修的时间还长,就是因为好多人一上来就敲 valgrind,结果要么根本跑不起来,要么把…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉