策略设计模式
- 🚩什么是策略设计模式?
- 🚩策略设计模式的特点
- 🚩策略设计模式的结构
- 🚩策略设计模式的优缺点
- 🚩策略设计模式的Java实现
- 🚩代码总结
- 🚩总结
🚩什么是策略设计模式?
策略设计模式(Strategy Pattern) 是一种 行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用算法的客户。策略模式让算法独立于使用它的客户端而变化。
使用场景
-
当需要在运行时选择不同的算法变体时
-
当一个类定义了多种行为,并且这些行为以多个条件语句的形式出现时
-
当需要隔离算法的具体实现与使用算法的客户端时
-
适用于 支付方式选择、排序算法切换、折扣计算 等场景
🚩策略设计模式的特点
-
定义算法族:将相关的算法封装成独立的策略类
-
运行时切换:可以在运行时动态改变对象使用的算法
-
消除条件语句:
避免使用多重条件判断来选择算法
-
开闭原则:新增策略无需修改已有代码
-
单一职责:每个策略类只负责一个算法
🚩策略设计模式的结构
策略模式主要包含以下部分:
-
Context(环境类)
:持有一个策略类的引用,调用具体策略 -
Strategy(抽象策略)
:定义所有支持的算法的公共接口 -
ConcreteStrategy(具体策略)
:实现抽象策略定义的算法
图例:
🚩策略设计模式的优缺点
✅ 优点
-
算法可自由切换:策略类之间可以自由替换
-
避免多重条件判断:将算法实现与使用分离
-
扩展性好:增加新策略无需修改原有代码
-
符合开闭原则:对扩展开放,对修改关闭
-
易于单元测试:每个策略可以单独测试
❌ 缺点
-
策略类数量增多:每个策略都是一个类,可能增加系统复杂度
-
客户端必须了解所有策略:需要知道不同策略的区别
-
策略对象可能增加开销:如果策略是无状态的,可以考虑共享
🚩策略设计模式的Java实现
代码地址:GitHub
- 创建一个公共策略接口,定义公共操作两数操作方法
TwoNumberOperation
/**
* @author hanson.huang
* @version V1.0
* @InterfaceName Strategy
* @Description 所有策略的公共操作
* @date 2025/3/26 10:14
**/
public interface Strategy {
public void TwoNumberOperation(int a, int b);
}
-
定义三个具体的策略类,
AddStrategy
、SubtractionStrategy
、MultiplyStrategy
AddStrategy
两数之和
/** * @author hanson.huang * @version V1.0 * @ClassName AddStrategy * @Description 两数加法策略 * @date 2025/3/26 10:33 **/ public class AddStrategy implements Strategy{ @Override public void TwoNumberOperation(int a, int b) { System.out.println(a + b); } }
SubtractionStrategy
两数之差
/** * @author hanson.huang * @version V1.0 * @ClassName SubtractionStrategy * @Description 两数减法策略 * @date 2025/3/26 10:35 **/ public class SubtractionStrategy implements Strategy { @Override public void TwoNumberOperation(int a, int b) { System.out.println(a - b); } }
MultiplyStrategy
两数之积
/** * @author hanson.huang * @version V1.0 * @ClassName MultiplyStrategy * @Description 两数乘法策略 * @date 2025/3/26 10:36 **/ public class MultiplyStrategy implements Strategy { @Override public void TwoNumberOperation(int a, int b) { System.out.println(a * b); } }
-
OperationContext
策略类引用
/**
* @author hanson.huang
* @version V1.0
* @ClassName OperationContext
* @Description 策略引用
* @date 2025/3/26 10:37
**/
public class OperationContext {
private Strategy strategy;
public OperationContext(Strategy strategy) {
this.strategy = strategy;
}
public void Operation(int a, int b) {
strategy.TwoNumberOperation(a, b);
}
}
📌 运行结果
🚩代码总结
-
Strategy
接口定义了所有策略的公共操作 -
AddStrategy
、SubtractionStrategy
、MultiplyStrategy
是具体策略实现 -
OperationContext
是环境类,持有一个策略引用 -
客户端可以动态切换不同的策略对象
🚩总结
-
策略设计模式 定义算法族并封装每个算法,使它们可以互相替换
-
核心是 将算法与使用算法的客户端解耦,避免使用条件语句
-
适用于 需要动态切换算法 或 有多种相似行为 的场景
✅ Java源码中的应用场景:
-
Java集合框架中的
Comparator
:- 不同的排序策略可以通过实现
Comparator
接口来实现
- 不同的排序策略可以通过实现
-
Java线程池的拒绝策略:
AbortPolicy
、CallerRunsPolicy
等不同的拒绝策略实现
创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️