跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

策略模式详解:将 if-else 转化为可切换算法

策略模式是一种行为型设计模式,通过将算法封装为独立对象实现运行期切换。它消除了冗余的条件判断,符合开闭原则,提升了代码的可维护性与扩展性。文章以价格计算为例演示了接口、具体策略及上下文的构建,对比了与模板方法的区别,适用于规则引擎、支付策略等场景。

雪落无声发布于 2026/3/22更新于 2026/6/1929 浏览
策略模式详解:将 if-else 转化为可切换算法

1. 引言:if-else 正在失控

在实际项目中,你很可能见过这样的代码:

public double calculate(double price, String type) {
    if ("VIP".equals(type)) {
        return price * 0.8;
    } else if ("SVIP".equals(type)) {
        return price * 0.6;
    } else if ("NORMAL".equals(type)) {
        return price;
    }
    return price;
}

问题非常明显:

  • if-else 越来越长
  • 新规则要改老代码
  • 违反开闭原则

当条件分支开始膨胀时,策略模式就是最优解。


2. 什么是策略模式

GoF 定义

定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。

详解:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

一句话理解:

把算法当成对象来用。


3. 策略模式的核心思想

策略模式的本质是:

  • 行为抽象
  • 算法解耦
  • 运行期切换

它强调:

用组合代替条件判断。


4. 策略模式的结构

策略模式包含三个角色:

  1. Strategy(策略接口)类

这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  1. ConcreteStrategy(具体策略)类

实现了抽象策略定义的接口,提供具体的算法实现或行为。

  1. Context(上下文)

持有一个策略类的引用,最终给客户端调用。


5. 示例:商品价格计算

5.1 策略接口
public interface PriceStrategy {
    double calculate(double price);
}
5.2 具体策略
public class NormalPriceStrategy implements PriceStrategy {
    public double calculate(double price) {
        return price;
    }
}
public class VipPriceStrategy implements PriceStrategy {
    public double calculate(double price) {
        return price * 0.8;
    }
}
public class SvipPriceStrategy implements PriceStrategy {
    public double calculate(double price) {
        return price * 0.6;
    }
}
5.3 上下文
public class PriceContext {
    private PriceStrategy strategy;

    public PriceContext(PriceStrategy strategy) {
        this.strategy = strategy;
    }

    public double getFinalPrice(double price) {
        return strategy.calculate(price);
    }
}
5.4 客户端使用
PriceContext context = new PriceContext(new VipPriceStrategy());
System.out.println(context.getFinalPrice(100));

运行时随意切换算法。


6. 策略模式的优点

  1. 消除 if-else
  2. 算法可自由扩展
  3. 符合开闭原则
  4. 运行期灵活切换

7. 策略模式的缺点

  1. 类数量增加
  2. 客户端需理解策略
  3. 策略选择逻辑需额外管理

8. 策略 vs 模板方法

维度策略模式模板方法
技术手段组合继承
切换方式运行期编译期
灵活性高中

9. JDK 中的策略模式

Comparator
Collections.sort(list, comparator);

排序算法不变,比较规则可切换。


10. 适用场景

  • 规则引擎
  • 支付策略
  • 排序算法
  • 风控策略

11. 一个常见误区

策略模式不是为了'多写类',而是为了'少写条件判断'。


参考

策略模式 | 菜鸟教程

《图解设计模式》

策略 - Java 教程 - 廖雪峰的官方网站

策略设计模式

目录

  1. 1. 引言:if-else 正在失控
  2. 2. 什么是策略模式
  3. GoF 定义
  4. 3. 策略模式的核心思想
  5. 4. 策略模式的结构
  6. 5. 示例:商品价格计算
  7. 5.1 策略接口
  8. 5.2 具体策略
  9. 5.3 上下文
  10. 5.4 客户端使用
  11. 6. 策略模式的优点
  12. 7. 策略模式的缺点
  13. 8. 策略 vs 模板方法
  14. 9. JDK 中的策略模式
  15. Comparator
  16. 10. 适用场景
  17. 11. 一个常见误区
  18. 参考
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型落地实战指南:显卡选型、模型训练与未来展望
  • 网络安全入门指南:掌握五大核心能力构建安全思维
  • 基于 FPGA 的高精度 TDC 设计
  • LLaMA-Factory 大模型微调实战指南
  • 2025 年蓝桥杯省赛 C++大学 A 组试题解析
  • 2026 边缘 AI 视觉白皮书:算法固化与产线工程师转型
  • nvm 安装指定版本 Node.js 失败解决方案
  • Spring AI Agent Skills 功能介绍与实战指南
  • AI 智能客服系统构建方案:选型指南与实战避坑
  • OpenAI Codex 全面上手指南
  • Python act-atmos 大气数据处理工具包介绍
  • 昇腾 CANN 学习路径指南:Python、C++ 与算子开发选型
  • Meta-Llama-3-8B-Instruct 代码能力测试及 HumanEval 45+ 解析
  • Python 字典(dict)数据类型详解
  • JavaScript 错误处理:Uncaught (in promise) 错误分析与解决方案
  • OpenClaw 机器人本地部署与配置实战
  • 告别 MobaXterm:开源终端模拟器 Tabby 深度对比与迁移指南
  • AI 辅助前端页面开发提速 3 倍:生成 HTML+CSS 仅需改细节
  • Python IDLE 中文汉化方法
  • 制造业 AI 落地实战指南:6 大核心场景与大模型应用

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online