✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式——策略模式 (Strategy Pattern)详解
📚 ** ps ** :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出。
目录
一. 背景
二. 简介
三. 核心思想
四. 主要角色
五. 简单demo(Java)
六. 策略模式的优点
七. 策略模式的缺点
八. 总结
一. 背景
我原本也不知道策略模式是什么......知道有一天,发现手上需求的底层用的就是策略模式,于是才恍然大悟。于是结合网上的一些资料,完成了这篇博客。
二. 简介
策略模式 是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。
大白话讲,就是定义了几个表示不同类型的类,让它们可以作为参数传入管理类的同一个方法中——至于为什么都满足管理类的方法参数条件,因为这些类型类都实现了一个相同的基类.......
三. 核心思想
- 定义一组算法:把它们封装成独立的类(即策略类),这些类实现相同的接口或继承相同的抽象类。
- 运行时动态选择算法:客户端在使用时根据需要选择具体的策略,而不需要修改使用算法的代码。
- 遵循开闭原则(OCP):对扩展开放,对修改关闭。新增策略时无需修改已有代码。
四. 主要角色
- Context(上下文)
持有一个策略对象的引用,负责与客户端交互,并调用策略对象的方法来执行具体行为。- Strategy(策略接口)
定义所有支持的算法或行为的公共接口。- ConcreteStrategy(具体策略类)
实现 Strategy 接口,提供具体的算法实现。
五. 简单demo(Java)
下面代码模拟了一个电商系统,针对不同用户类型(如普通用户、VIP用户)有实现不同的折扣策略。
// Strategy: 折扣策略接口 public interface DiscountStrategy {double applyDiscount(double originalPrice); }
// ConcreteStrategy: 普通用户无折扣 public class NoDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double originalPrice) {return originalPrice;} }// ConcreteStrategy: VIP用户打8折 public class VipDiscountStrategy implements DiscountStrategy {@Overridepublic double applyDiscount(double originalPrice) {return originalPrice * 0.8;} }
// Context: 负责使用策略 public class PricingContext {private DiscountStrategy discountStrategy;// 设置策略public void setDiscountStrategy(DiscountStrategy strategy) {this.discountStrategy = strategy;}// 执行折扣计算public double calculatePrice(double originalPrice) {if (discountStrategy == null) {throw new IllegalStateException("未设置折扣策略");}return discountStrategy.applyDiscount(originalPrice);} }
public class Client {public static void main(String[] args) {PricingContext context = new PricingContext();double price = 100.0;// 普通用户,无折扣context.setDiscountStrategy(new NoDiscountStrategy());System.out.println("普通用户价格: " + context.calculatePrice(price)); // 输出 100.0// VIP用户,打8折context.setDiscountStrategy(new VipDiscountStrategy());System.out.println("VIP用户价格: " + context.calculatePrice(price)); // 输出 80.0} }
通过上面的这些代码,通过简单的改变参数,就实现了对价格计算的快速替换,减少了if/else的判断逻辑,让代码更加简洁,并且容易扩展。
六. 策略模式的优点
- 开闭原则:新增策略不影响现有代码。
- 消除条件语句:避免大量的 if-else 或 switch-case。
- 提高可维护性与可扩展性:策略实现独立,易于理解和替换。
- 算法复用:策略可以在不同的上下文中复用。
七. 策略模式的缺点
- 客户端必须了解不同策略:客户端需要知道有哪些策略并选择合适的策略。
- 类数量增多:每一种策略都是一个类,可能会增加类的数量。
- 策略对象之间的通信较复杂时处理不便:如果策略之间有依赖关系,可能需要额外设计。
八. 总结
策略模式是一种行为型模式。通过定义一系列封装并可互换算法,以达到避免大量条件判断,实现算法的灵活切换和扩展的目的。
最后,
其它设计模式会陆续更新,希望文章对你有所帮助!