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

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

示例:

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

总结

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

相关推荐
琢磨先生David2 小时前
构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
java·设计模式·建造者模式
不爱学英文的码字机器7 小时前
[操作系统] 策略模式进行日志模块设计
c++·策略模式
敲代码的 蜡笔小新9 小时前
【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略
unity·设计模式·c#·策略模式
_yingty_9 小时前
Java设计模式-策略模式(行为型)
java·设计模式·策略模式
炎芯随笔19 小时前
【C++】【设计模式】生产者-消费者模型
开发语言·c++·设计模式
workflower1 天前
使用谱聚类将相似度矩阵分为2类
人工智能·深度学习·算法·机器学习·设计模式·软件工程·软件需求
枣伊吕波1 天前
第六节第二部分:抽象类的应用-模板方法设计模式
android·java·设计模式
lalajh1 天前
论软件设计模式及其应用
设计模式
Auc241 天前
OJ判题系统第6期之判题逻辑开发——设计思路、实现步骤、代码实现(策略模式)
java·开发语言·docker·容器·策略模式
ronshi1 天前
基于事件驱动和策略模式的差异化处理方案
策略模式·事件驱动