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

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

示例:

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

总结

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

相关推荐
多多*3 小时前
设计模式 工厂模式 工厂方法模式 抽象工厂模式
设计模式·工厂方法模式·抽象工厂模式
啥都不懂的小小白4 小时前
Java常见设计模式(上):创建型模式
java·开发语言·设计模式
花王江不语4 小时前
**模式的好处 (设计模式)
开发语言·设计模式
galaa20115 小时前
TypeScript设计模式(4):装饰器模式
设计模式
像污秽一样8 小时前
Java设计模式-基于MVC的WEB设计模式
java·设计模式·mvc
*^O^*—*^O^*10 小时前
设计模式-(状态模式,策略模式,代理模式,责任链模式)
设计模式·状态模式·策略模式
千里码!10 小时前
java23种设计模式-外观模式
设计模式·外观模式
码熔burning10 小时前
(十 一)趣学设计模式 之 组合模式!
java·设计模式·组合模式
重生之绝世牛码10 小时前
Java设计模式 —— 【行为型模式】中介者模式(Mediator Pattern)详解
java·大数据·开发语言·设计模式·设计原则·中介者模式