23种设计模式之【策略模式】-核心原理与 Java 实践

策略模式的核心原理

策略模式(Strategy Pattern)是一种行为型设计模式,它的核心思想可以概括为:将一系列可互换的算法封装起来,使得它们可以相互替换,并且算法的变化不会影响使用算法的客户端。

策略模式的三大核心角色

  • 抽象策略(Strategy):定义所有具体策略的公共接口,通常是一个接口或抽象类,声明了具体策略需要实现的方法。
  • 具体策略(Concrete Strategy):实现抽象策略接口,包含具体的算法实现。策略模式中可以有多个具体策略。
  • 上下文(Context):持有一个策略对象的引用,负责与策略对象交互。上下文会将具体的算法执行委托给策略对象,客户端通过上下文来使用策略,而无需直接与具体策略交互。

策略模式的核心优势

  • 消除大量条件判断:用多态替代 if-else 或 switch-case,使代码更清晰
  • 遵循开闭原则:新增策略只需实现接口,无需修改原有代码
  • 提高代码复用性:每个策略都是独立的类,便于复用和测试
  • 动态切换算法:可以在运行时根据需要切换不同的策略

策略模式的核心优势

  • 消除大量条件判断:用多态替代 if-else 或 switch-case,使代码更清晰
  • 遵循开闭原则:新增策略只需实现接口,无需修改原有代码
  • 提高代码复用性:每个策略都是独立的类,便于复用和测试
  • 动态切换算法:可以在运行时根据需要切换不同的策略

实际应用场景

策略模式在实际开发中广泛应用,例如:

支付方式选择:支付宝、微信、银联等不同支付策略

排序算法:冒泡排序、快速排序、归并排序等可互换

导航算法:步行导航、驾车导航、公共交通导航等

折扣计算:普通折扣、会员折扣、满减折扣等

Java 实践

java 复制代码
// 策略接口:计算操作
interface CalculationStrategy {
    int execute(int a, int b);
}

// 具体策略:加法
class AdditionStrategy implements CalculationStrategy {
    @Override
    public int execute(int a, int b) {
        return a + b;
    }
}

// 具体策略:减法
class SubtractionStrategy implements CalculationStrategy {
    @Override
    public int execute(int a, int b) {
        return a - b;
    }
}

// 具体策略:乘法
class MultiplicationStrategy implements CalculationStrategy {
    @Override
    public int execute(int a, int b) {
        return a * b;
    }
}

// 环境类:计算器
class Calculator {
    private CalculationStrategy strategy;
    
    public void setStrategy(CalculationStrategy strategy) {
        this.strategy = strategy;
    }
    
    public int calculate(int a, int b) {
        if (strategy == null) {
            throw new IllegalStateException("策略未设置");
        }
        return strategy.execute(a, b);
    }
}

// 测试类
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        
        // 使用加法策略
        calculator.setStrategy(new AdditionStrategy());
        System.out.println("10 + 5 = " + calculator.calculate(10, 5));
        
        // 使用减法策略
        calculator.setStrategy(new SubtractionStrategy());
        System.out.println("10 - 5 = " + calculator.calculate(10, 5));
        
        // 使用乘法策略
        calculator.setStrategy(new MultiplicationStrategy());
        System.out.println("10 * 5 = " + calculator.calculate(10, 5));
    }
}
相关推荐
Goldn.16 小时前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
李慕婉学姐17 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_7400437317 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖17 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
未若君雅裁18 小时前
JVM面试篇总结
java·jvm·面试
kk哥889918 小时前
C++ 对象 核心介绍
java·jvm·c++
招风的黑耳18 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
xunyan623419 小时前
面向对象(下)-接口的理解
java·开发语言
程序员游老板19 小时前
基于SpringBoot3+vue3的爱心陪诊平台
java·spring boot·毕业设计·软件工程·课程设计·信息与通信
期待のcode19 小时前
Springboot核心构建插件
java·spring boot·后端