策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为。其核心思想是将算法的定义、封装和替换分离,使得算法可以独立于客户端变化。
核心概念
- 策略接口(Strategy Interface):定义所有支持的算法的公共接口。
- 具体策略(Concrete Strategies):实现策略接口的具体算法。
- 上下文(Context):持有一个策略对象的引用,负责根据需要调用策略。
应用场景
- 当一个系统需要在多种算法中动态选择其一。
- 避免使用大量条件语句(如
if-else
或switch
)。 - 算法的变体需要独立于使用它的客户端。
代码示例
以下是一个简单的计算器示例,演示策略模式的实现:
// 策略接口:定义计算行为
public interface CalculationStrategy {
double calculate(double a, double b);
}
// 具体策略:加法
public class AdditionStrategy implements CalculationStrategy {
@Override
public double calculate(double a, double b) {
return a + b;
}
}
// 具体策略:减法
public class SubtractionStrategy implements CalculationStrategy {
@Override
public double calculate(double a, double b) {
return a - b;
}
}
// 具体策略:乘法
public class MultiplicationStrategy implements CalculationStrategy {
@Override
public double calculate(double a, double b) {
return a * b;
}
}
// 上下文:计算器
public class Calculator {
private CalculationStrategy strategy;
public Calculator(CalculationStrategy strategy) {
this.strategy = strategy;
}
public void setStrategy(CalculationStrategy strategy) {
this.strategy = strategy;
}
public double executeCalculation(double a, double b) {
return strategy.calculate(a, b);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 使用加法策略
Calculator calculator = new Calculator(new AdditionStrategy());
System.out.println("10 + 5 = " + calculator.executeCalculation(10, 5));
// 切换为乘法策略
calculator.setStrategy(new MultiplicationStrategy());
System.out.println("10 * 5 = " + calculator.executeCalculation(10, 5));
}
}
策略模式的优势
- 算法独立变化:新增策略无需修改上下文或客户端代码。
- 避免条件语句:替代复杂的条件判断,提高代码可读性。
- 开闭原则:支持扩展新策略,符合设计原则。
策略模式 vs 状态模式
- 策略模式:客户端主动切换策略,算法间无依赖。
- 状态模式:状态自动切换,状态间存在转换逻辑。
实际应用案例
- Java集合框架:
Comparator
接口是策略模式的典型应用。 - Spring框架:
BeanFactory
使用策略模式配置对象创建方式。 - 游戏开发:角色的攻击、防御行为可通过策略模式动态切换。
总结
策略模式通过封装算法族,提供了灵活的算法替换机制,使代码更具可维护性和可扩展性。使用时需注意策略类数量过多可能导致类膨胀问题,可结合工厂模式或枚举优化策略的创建。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.lifengdi.com/archives/article/design-mode/4417
文章评论