李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于我
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 后端
  3. 正文

Java设计模式:策略模式

2025年5月22日 约 713 字3 分钟 47 0 0
合集:Java设计模式第 2 篇 / 共 8 篇
Java›Java设计模式
  1. 1Java设计模式:状态模式
  2. 2Java设计模式:策略模式当前
  3. 3Java设计模式:模板方法模式
  4. 4JAVA设计模式-抽象工厂模式
  5. 5JAVA设计模式-工厂方法模式
  6. 6Java设计模式-原型模式
  7. 7Java设计模式-单例模式
  8. 8设计模式总结

策略模式(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/hou-duan/4417

推荐阅读

  • Java设计模式:状态模式
  • Java设计模式:模板方法模式
  • JAVA设计模式-抽象工厂模式
  • JAVA设计模式-工厂方法模式
  • Java设计模式-原型模式
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JAVA 策略模式 设计模式
最后更新:2026年7月14日
相关文章
  • 从万级到千万级:排行榜系统的6种实现方案深度解析(含原理、优化与实战)2025年10月29日
  • RocketMQ的push消费方式实现详解2022年8月9日
  • SpringBoot和SpringCloud版本对应2019年8月29日
  • SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询2019年9月12日
  • JAVA设计模式-抽象工厂模式2020年2月18日

李锋镝

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

打赏 点赞
< 合集上一篇
合集下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复

文章评论

还没有评论,快来抢沙发吧~

Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma -- which is living with the results of other people's thinking. Don't let the noise of other's opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
每日早报 · 2026年8月18日 写了一个订阅每日新闻的WP插件 每日早报 · 2026年8月17日 每日早报 · 2026年8月16日 每日早报 · 2026年8月15日 每日早报 · 2026年8月14日
给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?增加了两套复古皮肤-牛皮纸、千禧网页这个域名注册整整十年了,十年时间,真快啊Kratos+ v1.1.14版本更新说明
CC知识共享协议各协议内容解释 深度解析多级缓存架构:从设计到落地,彻底解决数据一致性难题 从零开始入门 K8s | Kubernetes 网络概念及策略控制 AI原生数据库新标杆:seekdb深度解析,轻量架构与混合搜索的双重革命 结合Apollo配置中心实现日志级别动态配置 使用RocketMQ时,服务启动过程中,Consumer在服务未启动时消费消息问题处理
最近评论
李锋镝 发布于 3 小时前(08月18日) 给主题加了个功能,可以在RSS中排除指定分类,哈哈哈
李锋镝 发布于 4 小时前(08月18日) :8: 喜欢就好
不凡 发布于 14 小时前(08月17日) 哇,配色真好看,观感很舒服! :52:
李锋镝 发布于 17 小时前(08月17日) 哈哈哈,那个插件我之前也用过,那个内容都是固定的,我这个每天不同的时间拉取数据也不一样,等我研究研究...
Hary 发布于 17 小时前(08月17日) emmm大哥,这样每天输出到博客,然后别人订阅rss全是这个,有点不太好,之前很流行一段时间每天60...
标签聚合
Redis MQ JVM MySQL 多线程 ElasticSearch 日常 Claude IDEA AI 分布式 SpringBoot SQL AI编程 K8s 数据库 WordPress JAVA 架构 Spring
友情链接
  • 瓦匠个人小站
  • 若梦博客
  • 九仞之行
  • 老张博客
  • 知向前端
  • 哥斯拉
  • Honesty
  • 韩情脉脉
  • 皮皮社
  • Serendipity
  • Mr.Sun的博客
  • 韩小韩博客
  • 志文工作室
  • 懋和道人
  • 临窗旋墨
  • 搬砖日记
  • 林羽凡
  • 彬红茶日记
  • 蜗牛工作室
  • sssr7844的博客

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

正在博友圈履约中

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号