【设计模式】策略模式(Strategy)详解:把 if-else 变成可切换的算法

【设计模式】策略模式(Strategy)详解:把 if-else 变成可切换的算法

文章目录

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

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

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

问题非常明显:

  • if-else 越来越长
  • 新规则要改老代码
  • 违反开闭原则
当条件分支开始膨胀时,策略模式就是最优解。有选择,就有策略。

2. 什么是策略模式

GoF 定义

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

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

一句话理解:

把算法当成对象来用。

3. 策略模式的核心思想

策略模式的本质是:

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

它强调:

用组合代替条件判断。

4. 策略模式的结构

策略模式包含三个角色:

  1. Strategy(策略接口)类

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

  1. ConcreteStrategy(具体策略)类

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

  1. Context(上下文)

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


5. 示例:商品价格计算

5.1 策略接口

publicinterfacePriceStrategy{doublecalculate(double price);}

5.2 具体策略

publicclassNormalPriceStrategyimplementsPriceStrategy{publicdoublecalculate(double price){return price;}}
publicclassVipPriceStrategyimplementsPriceStrategy{publicdoublecalculate(double price){return price *0.8;}}
publicclassSvipPriceStrategyimplementsPriceStrategy{publicdoublecalculate(double price){return price *0.6;}}

5.3 上下文

publicclassPriceContext{privatePriceStrategy strategy;publicPriceContext(PriceStrategy strategy){this.strategy = strategy;}publicdoublegetFinalPrice(double price){return strategy.calculate(price);}}

5.4 客户端使用

PriceContext context =newPriceContext(newVipPriceStrategy());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教程 - 廖雪峰的官方网站

策略设计模式

Read more

Python 基础与环境配置

Python 基础与环境配置

第一篇:Python 基础与环境配置 学习目标 💡 掌握 Python 语言的基本语法和编程思想 💡 学会安装和配置 Python 开发环境 💡 理解并熟练运用 Python 的数据类型、变量和运算符 💡 掌握 Python 的流程控制语句(条件判断、循环) 💡 学会使用 Python 的函数和模块 💡 了解 Python 的常用开发工具和集成开发环境(IDE) 💡 具备编写简单 Python 程序的能力 重点内容 * Python 语言的发展历程与特点 * Python 开发环境的安装与配置 * Python 的基本语法(变量、数据类型、运算符) * 流程控制语句(if 语句、for 循环、while 循环) * 函数的定义、调用和参数传递 * 模块和包的使用 * 常用开发工具和

By Ne0inhk
Python中的“==“与“is“:深入解析与Vibe Coding时代的优化实践

Python中的“==“与“is“:深入解析与Vibe Coding时代的优化实践

🌟 Python中的"=="与"is":深入解析与Vibe Coding时代的优化实践 * 1. 🧐 `==`与`is`的本质区别 * 2. 🕵️‍♂️ `is`判断对象身份 - 数组与常量池案例 * 案例1:列表对象的身份 * 案例2:小整数常量池 * 案例3:字符串驻留 * 3. 🔍 `==`与`__eq__`魔法函数 * 4. 🔎 类型判断的正确姿势:使用`is` * 5. 🚀 Vibe Coding时代的提示词优化 * 场景1:解释概念 * 场景2:代码生成 * 场景3:调试帮助 * 📊 对比总结表 * 💡 实际应用建议 * 🌈 结语 在Python的奇妙世界中,==和is这两个看似简单的操作符常常让初学者感到困惑。它们如同双胞胎,外表相似却性格迥异。本文将带你深入探索它们的区别,并通过生动的案例和图表展示它们的应用场景,

By Ne0inhk

python,numpy,pandas和matplotlib版本对应关系

下面是Python、NumPy、Pandas、Matplotlib的版本对应关系表(基于官方兼容性文档和实践验证,包含常用Python版本),同时补充了推荐的稳定组合: 常用Python版本对应的库兼容版本 Python版本NumPy兼容版本Pandas兼容版本Matplotlib兼容版本推荐稳定组合示例3.8.x1.19.x ~ 1.21.x1.1.x ~ 1.3.x3.3.x ~ 3.5.xPython3.8 + NumPy1.21.6 + Pandas1.3.5 + Matplotlib3.5.33.9.x1.19.x ~ 1.24.x1.1.x ~ 1.5.x3.3.x

By Ne0inhk
c++:面向对象三大特性--继承

c++:面向对象三大特性--继承

面向对象三大特性--继承 * 一、继承的概念及定义 * (一)概念 * (二)继承格式 * 1、继承方式 * 2、格式写法 * 3、派生类继承后访问方式的变化 * (三)普通类继承 * (四)类模板继承 * 二、基类和派生类的转换 * (一)基类转换派生类 * (二)派生类转换基类 * 三、几个重要细节 * (一)继承与作用域 * 1、作用域 * 2、隐藏 * (二)继承与友元 * (三)继承与静态成员 * 四、继承中派生类的构造函数 * 五、多继承与菱形继承 * (一)多继承 * 多继承的指针偏移问题 * (二)菱形继承 * (三)虚继承 * 六、继承和组合 * 结束语: 一、

By Ne0inhk