当前位置: 首页 > news >正文

【设计模式】一文读懂策略模式

文章目录

    • 前言
    • 什么是策略模式?
    • 策略模式核心实践
    • 策略模式的优点
    • 策略模式的缺点

前言

学习设计模式不仅仅是炫技,还可以让你 在看各种代码时如鱼得水。碰到一些典型的设计模式,还会惊讶于Coder的设计。

今天来分享设计模式中的策略模式,也是最近在实习中看到的。

其实策略模式在项目中的应用很多,封装不同的算法,然后只需要调用即可,这样即使你不会设置一些算法(策略),但是你可以拿到别人设计好的策略开箱即用。

什么是策略模式?

就像之前说的,策略模式会定义一系列算法,或者叫做策略 - Strategy。每个算法会独立封装在特定的类中,使用哪个策略,直接调用替换即可。注意:替换的过程是在运行中动态完成的,不需要修改客户端代码。

  • 策略模式的组成部分
    • 抽象策略(Strategy):定义了所有策略类必须实现的接口或抽象类。
    • 具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含具体的算法实现。
    • 环境(Context):维护一个对策略对象的引用,并通过该引用调用策略。

一般我们的具体策略可以通过工厂模式来生产:策略对象。我们想要调用什么策略,就从工厂拿哪个策略即可。

谁去调用这个策略呢?可以维护一个Map。key就是我们的触发策略条件,value就是我们具体的策略;

接下来我们来看一个代码具体分析策略模式的作用:

策略模式核心实践

// 抽象策略接口
public interface Strategy {public int doOperation(int num1, int num2);
}// 具体策略类A
public class OperationAdd implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}// 具体策略类B
public class OperationSubtract implements Strategy {@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}// 环境类
public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}
}// 测试策略模式
public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new OperationAdd());System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubtract());System.out.println("10 - 5 = " + context.executeStrategy(10, 5));}
}

我们定义了两个策略,加策略 和 减策略。

Context是我们的环境,环境不知道具体调用了哪个策略,因为环境只配置了抽象策略类的引用。

具体调用哪个策略,由我们来决定,比如前端传入 + ,那么我可以从Map中匹配 + 对应的策略就是OperationAdd,此时我把OperationAdd添加到环境中,直接让环境调用抽象策略类,这样就选择到了我们的具体策略类的重写实现。

这就是策略模式的主要使用方式,

策略模式的优点

  1. 算法切换自由:可以在运行时根据需要切换不同的算法,而无需修改客户端代码。这使得系统更加灵活和可扩展。
  2. 避免多重条件判断:通过将算法封装在独立的策略类中,消除了复杂的条件语句(如 if-else 或 switch-case),使代码更加清晰和易于维护。
  3. 扩展性好:新增算法只需新增一个策略类,无需修改现有代码。这符合开闭原则(Open/Closed Principle),即对扩展开放,对修改关闭。
  4. 提高代码复用性:不同的策略类可以在不同的环境中复用,避免了代码重复。
    • 比如我们很多策略有重复的代码 ,我们就可以把相同的行为抽象成同一个,减少重复代码。
  5. 简化单元测试:每个策略类都可以独立测试,确保每个算法的正确性。同时也做到了业务逻辑与算法分离。

策略模式的缺点

  1. 如果你本来就用不到多少策略,算法不经常改变,这样你就没必要使用策略模式,只会增加代码的复杂度;
  2. 客户端必须知道不同策略的不同 - 我们需要选择合适的策略;

可以参考的文章:https://refactoringguru.cn/design-patterns/strategy

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ML】Pre-trained Language Models及其各种微调模型的实现细节和特点
  • zip压缩包的格式不标准导致C++开源unzip.cpp解压失败问题的排查
  • loginApi
  • 每天五分钟深度学习pytorch:训练神经网络模型的基本步骤
  • 【竞品分析】竞品分析报告的基本模板
  • 裁剪或填充张量(Tensor)(四维与五维)(Python代码)
  • 【Python】requests的response.text 和 urllib.request 的 response.read()的区别
  • 编程-设计模式 26:业务代表模式
  • Android11 关于三方应用获取su权限
  • 以Zed项目为例学习大型Rust项目的组织与管理
  • 数据结构----二叉树
  • Cairo库移植到安卓记录
  • 【登录扫码】--集成企业微信
  • todoList清单(HTML+CSS+JavaScript)
  • Linux中apache服务安装与mysql安装
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Angular6错误 Service: No provider for Renderer2
  • AngularJS指令开发(1)——参数详解
  • JavaScript中的对象个人分享
  • nfs客户端进程变D,延伸linux的lock
  • PHP 7 修改了什么呢 -- 2
  • SpringCloud集成分布式事务LCN (一)
  • 从输入URL到页面加载发生了什么
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 探索 JS 中的模块化
  • 在Unity中实现一个简单的消息管理器
  • UI设计初学者应该如何入门?
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (10)STL算法之搜索(二) 二分查找
  • (12)Hive调优——count distinct去重优化
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (九)c52学习之旅-定时器
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (小白学Java)Java简介和基本配置
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Core中Quartz的使用方法
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 的字符串暂存池
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET6实现破解Modbus poll点表配置文件
  • .Net的C#语言取月份数值对应的MonthName值
  • .net和php怎么连接,php和apache之间如何连接
  • [ 常用工具篇 ] POC-bomber 漏洞检测工具安装及使用详解
  • [100天算法】-x 的平方根(day 61)
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [20171106]配置客户端连接注意.txt
  • [C++][opencv]基于opencv实现photoshop算法图像剪切