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

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

示例:

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

总结

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

相关推荐
啦啦啦啦啦zzzz2 小时前
设计模式:桥接模式和组合模式
c++·设计模式·组合模式·桥接模式
饼干哥哥21 小时前
字节Seedance2.5终于上线,这次在收割谁?
人工智能·设计模式·前端框架
董员外21 小时前
RAG 系统进化论(六):GraphRAG(基于知识图谱的 RAG),从相似文本走向实体关系
人工智能·后端·设计模式
鬼鬼鬼1 天前
从 Prompt 到 Harness:企业级 Agent 工程的完整演进之路
设计模式·架构·ai编程
啦啦啦啦啦zzzz1 天前
设计模式:原型模式
c++·设计模式·原型模式
董员外1 天前
RAG 系统进化论(五):Corrective RAG 与 Self-RAG,让系统发现并纠正错误
人工智能·后端·设计模式
workflower1 天前
高质量数据集的类型
人工智能·机器学习·设计模式·自然语言处理·机器人
啦啦啦啦啦zzzz2 天前
工具:动态类工厂和用配置文件存储属性
c++·设计模式·工具·动态工厂
Nontee2 天前
设计模式:模板方法与策略,从“每个字都认识“到能说清它们在干嘛
java·数据库·设计模式
choumin2 天前
行为型模式——模板方法模式
c++·设计模式·模板方法模式·行为型模式