设计模式之策略模式(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、用户自定义行为

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

示例:

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

总结

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

相关推荐
笨手笨脚の1 分钟前
设计模式-适配器模式
设计模式·适配器模式·结构型设计模式
青草地溪水旁4 小时前
第五章:原型模式 - 克隆大法的大师
c++·设计模式·原型模式
1710orange6 小时前
java设计模式:静态代理模式
java·设计模式·代理模式
我真的是大笨蛋7 小时前
开闭原则详解(OCP)
java·设计模式·性能优化·开闭原则·设计规范
1710orange11 小时前
java设计模式:动态代理
java·开发语言·设计模式
简小瑞12 小时前
VSCode用它管理上千个服务:依赖注入从入门到实战
前端·设计模式
charlie11451419113 小时前
精读C++20设计模式——结构型设计模式:外观模式
c++·学习·设计模式·c++20·外观模式
liulilittle14 小时前
macOS 内核路由表操作:直接 API 编程指南
网络·c++·macos·策略模式·路由·route·通信
拧之1 天前
✅设计模式笔记
笔记·单例模式·设计模式
haoly19891 天前
数据结构与算法篇--语义智能指针设计模式
数据结构·设计模式