李锋镝的博客

  • 首页
  • 时间轴
  • 留言
  • 插件
  • 左邻右舍
  • 关于我
    • 关于我
    • 另一个网站
  • 知识库
  • 赞助
Destiny
自是人生长恨水长东
  1. 首页
  2. 原创
  3. 设计模式
  4. 正文

Java设计模式:策略模式

2025年5月22日 18点热度 0人点赞 0条评论

策略模式(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));
    }
}

策略模式的优势

  1. 算法独立变化:新增策略无需修改上下文或客户端代码。
  2. 避免条件语句:替代复杂的条件判断,提高代码可读性。
  3. 开闭原则:支持扩展新策略,符合设计原则。

策略模式 vs 状态模式

  • 策略模式:客户端主动切换策略,算法间无依赖。
  • 状态模式:状态自动切换,状态间存在转换逻辑。

实际应用案例

  • Java集合框架:Comparator接口是策略模式的典型应用。
  • Spring框架:BeanFactory使用策略模式配置对象创建方式。
  • 游戏开发:角色的攻击、防御行为可通过策略模式动态切换。

总结

策略模式通过封装算法族,提供了灵活的算法替换机制,使代码更具可维护性和可扩展性。使用时需注意策略类数量过多可能导致类膨胀问题,可结合工厂模式或枚举优化策略的创建。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/archives/article/design-mode/4417

相关文章

  • Java设计模式:状态模式
  • Java设计模式:模板方法模式
  • JAVA设计模式-抽象工厂模式
  • JAVA设计模式-工厂方法模式
  • Java设计模式-原型模式
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JAVA 策略模式 设计模式
最后更新:2025年5月22日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >

文章评论

1 2 3 4 5 6 7 8 9 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 57 58 60 61 62 63 64 65 66 67 69 72 74 76 77 78 79 80 81 82 85 86 87 90 92 93 94 95 96 97 98 99
取消回复

我是人间惆怅客,知君何事泪纵横,断肠声里忆平生。

最新 热点 随机
最新 热点 随机
@Valid 和 @Validated 的区别 URL地址末尾加不加“/”有什么区别 Java设计模式:状态模式 Java设计模式:策略模式 Java设计模式:模板方法模式 Docker核心概念解析及使用
玩博客的人是不是越来越少了?2024年11月1号 农历十月初一准备入手个亚太的ECS,友友们有什么建议吗?别再背线程池的七大参数了,现在面试官都这么问我的第一个WordPress插件:Dylan Custom Plugin上线了动态线程池框架DynamicTp使用以及架构设计
jmap命令(jdk1.8) 妈呀,昨天晚上睡觉做了一晚上的梦,可累死我了 基于Java8的Either类 如何高效的学习技术? 离骚 准备入手个亚太的ECS,友友们有什么建议吗?
标签聚合
ElasticSearch 文学 设计模式 MySQL SpringBoot SQL JAVA 数据库 K8s 教程 多线程 JVM Spring 分布式 IDEA 架构 docker Redis 面试 日常
友情链接
  • i架构
  • LyShark - 孤风洗剑
  • 临窗旋墨
  • 博友圈
  • 博客录
  • 博客星球
  • 哥斯拉
  • 志文工作室
  • 搬砖日记
  • 旋律的博客
  • 旧时繁华
  • 林羽凡
  • 知向前端
  • 集博栈
  • 韩小韩博客

COPYRIGHT © 2025 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Dylan

津ICP备2024022503号-3