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

设计模式之策略模式(Strategy Pattern)

模式定义

        定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

模式类图

示例

以鸭子为例子,实现三个鸭子,分别为:绿头鸭、红头鸭和橡皮鸭,实现不同的飞行行为:会飞和不会飞。如下:

优点

1. **解耦合**:策略模式可以将一个算法的实现与其使用环境分离开来,从而使得算法可以独立于使用环境变化。这有助于降低系统的耦合度,提高系统的灵活性和可维护性。

2. **易于扩展**:由于策略模式将算法封装在单独的类中,新的算法可以通过简单地添加新的策略类来实现,而不需要修改原有的代码。这样可以大大简化系统的扩展过程。

3. **可替换性**:策略模式允许在运行时动态地更改算法,这使得系统能够根据不同的情况选择最合适的算法。

4. **避免使用条件语句**:在某些情况下,使用策略模式可以避免在代码中出现大量的if-else语句或switch-case语句,提高代码的可读性和可维护性。

5. **符合开闭原则**:策略模式满足开闭原则(Open-Closed Principle),即软件实体应该对扩展开放,对修改关闭。通过添加新的策略类,可以扩展系统的功能,而不需要修改已有的代码。

使用场景

1、多种算法或行为的动态切换

场景描述:当一个系统需要在多种算法或行为之间动态切换时,策略模式可以避免使用大量的条件判断语句(如 if-else 或 switch-case)。

示例:支付系统中,支持多种支付方式(如支付宝、微信、信用卡等),可以根据用户选择动态切换支付策略。

2、避免代码重复

场景描述:当多个类或方法中存在相似的逻辑,但具体实现不同时,可以将这些逻辑提取为策略,避免代码重复。

示例:电商系统中,不同的商品类型(如普通商品、秒杀商品、预售商品)有不同的价格计算规则,可以将价格计算逻辑封装为策略。

3、扩展性需求

场景描述:当系统需要支持未来可能新增的算法或行为时,策略模式可以通过新增策略类来扩展功能,而无需修改现有代码。

示例:日志系统中,支持多种日志输出方式(如文件、数据库、控制台),未来可以轻松新增其他输出方式(如远程服务器)。

4、测试和维护的便利性

场景描述:策略模式将算法或行为封装到独立的类中,便于单元测试和代码维护。

示例:在游戏中,不同的角色有不同的攻击方式(如近战、远程、魔法),可以将攻击行为封装为策略,便于单独测试和维护。

5、复杂条件逻辑的简化

场景描述:当系统中存在复杂的条件逻辑时,策略模式可以将这些逻辑拆分为独立的策略类,使代码更加清晰。

示例:交通导航系统中,根据不同的交通状况(如拥堵、正常、施工)选择不同的导航策略。

6、业务规则的多变

场景描述:当业务规则经常变化时,策略模式可以将规则封装为策略,便于快速调整。

示例:促销活动中,不同的促销规则(如满减、折扣、赠品)可以封装为策略,方便根据市场需求调整。

7、多平台或多环境的适配

场景描述:当系统需要适配不同的平台或环境时,策略模式可以为每种平台或环境提供独立的实现。

示例:文件上传功能中,支持多种存储平台(如本地、阿里云、AWS),可以将上传逻辑封装为策略。

8、用户自定义行为

场景描述:当系统需要支持用户自定义行为或配置时,策略模式可以将这些行为封装为策略,供用户选择。

示例:

报表系统中,用户可以选择不同的数据展示方式(如表格、图表、地图),每种展示方式可以封装为策略。

总结

        策略模式的核心优势在于它的灵活性和可扩展性,适用于需要动态切换算法或行为、避免代码重复、简化复杂逻辑的场景。通过将算法或行为封装为独立的策略类,策略模式可以使代码更加清晰、易于维护和扩展。


http://www.kler.cn/a/563343.html

相关文章:

  • LeetCode 热题 100 子串章节
  • AI DEV 人工智能能做的工作,在开发运维安全方面以及企业成本降低方面所起的作用和相应的提示词。
  • Java(五十八)双列集合Properties
  • AI 简史:人工智能发展历程
  • ubuntu上boost卸载和安装
  • vuetify项目添加代理跨域请求
  • 【无标题】oscp备考,oscp系列——Tr0ll1靶场,两种提权方式,ftp匿名登录,ssh爆破,ubuntu内核提权,计划任务
  • leetcode 169. 多数元素
  • 爬虫反爬:字体反爬案例分析与爬取实战
  • 记一次线上Tomcat服务内存溢出的问题处理
  • JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用
  • 什么是完全前向保密(PFS)?
  • muduo网络库2
  • HTTP 动态报错码的原因和解决方法
  • 力扣——完全平方数
  • ChatGPT入驻Safari,AI搜索时代加速到来
  • 安科瑞DJSF1352直流电能表在光伏串组箱的应用:提升光伏发电效率与安全的智能利器-安科瑞 耿笠
  • 【JavaEE进阶】MyBatis 操作数据库(1)
  • Mysql疑难报错排查 - Field ‘XXX‘ doesn‘t have a default value
  • MySQL--索引的优化--LIKE模糊查询