李锋镝的博客

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

Java设计模式:策略模式

2025年5月22日 284点热度 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/hou-duan/4417

相关文章

  • 6个高频设计模式深度解析(附完整案例与避坑指南)
  • Java设计模式:状态模式
  • Java设计模式:模板方法模式
  • JAVA设计模式-抽象工厂模式
  • JAVA设计模式-工厂方法模式
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: JAVA 策略模式 设计模式
最后更新:2025年11月20日

李锋镝

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

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

文章评论

秋天是倒放的春天,晚安是爱你的序篇。

那年今日(07月03日)

  • 2005年:西班牙正式通过同性婚姻相关法案
  • 1969年:英国滚石乐队的创始团员布莱恩·琼斯去世
  • 1876年:中国第一条铁路淞沪铁路正式通车运营
  • 1518年:中国明代医学家兼药物学家李时珍出生
  • 1062年:中国北宋官员包拯去世
  • 更多历史事件
最新 热点 随机
最新 热点 随机
Kratos+主题新功能预览及功能演示 SpringBoot DeferredLog 完整详解 LiteLLM 本地代理搭建 Claude-HUD 使用文档 Kratos+ —— Kratos 主题二次开发记录 译文:如何将单体应用拆解为微服务
AI时代,个人技术博客的出路在哪里?这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了做了一个WordPress文章热力图插件千万级大表新增字段实战指南:告别锁表与业务中断
Auld Lang Syne 缓存架构实战指南:6大核心缓存技术深度解析与落地方案 阿里巴巴的26款超神Java开源项目 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 岁末 海琴烟~~~
最近评论
李锋镝 发布于 4 天前(06月30日) 目前是每天一换,一个星期不重样 :41:
不凡 发布于 4 天前(06月29日) 主题配色挺好看。 :2:
李锋镝 发布于 5 天前(06月29日) 已经更新了~
懋和道人 发布于 5 天前(06月29日) 境外与附件不能访问,其他都是正常的,如果不正常可以通过更换ip访问。
李锋镝 发布于 5 天前(06月29日) 403呀道长
标签聚合
SQL 多线程 日常 IDEA 数据库 ElasticSearch Spring AI编程 JVM JAVA SpringBoot MCP 分布式 MySQL docker AI 架构 K8s Redis WordPress
友情链接
  • Blogs·CN
  • Honesty
  • Mr.Sun的博客
  • 临窗旋墨
  • 哥斯拉
  • 彬红茶日记
  • 志文工作室
  • 懋和道人
  • 拾趣博客导航
  • 搬砖日记
  • 旧时繁华
  • 林羽凡
  • 瓦匠个人小站
  • 皮皮社
  • 知向前端
  • 蜗牛工作室
  • 韩小韩博客
  • 风渡言

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号