news 2026/4/18 9:59:17

设计模式——策略模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
设计模式——策略模式

策略模式 (Strategy Pattern)

什么是策略模式?

策略模式是一种行为型设计模式,它允许你定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换

简单来说:策略模式就是"多选一",根据不同情况选择不同的算法。

生活中的例子

想象一下:

  • 出行方式:走路、骑车、开车、坐公交
  • 支付方式:现金、微信、支付宝、银行卡
  • 排序算法:冒泡排序、快速排序、归并排序

为什么需要策略模式?

传统方式的问题

// 使用if-else处理if(type=="走路"){walk();}elseif(type=="骑车"){ride();}elseif(type=="开车"){drive();}

问题

  1. 代码臃肿:大量if-else导致代码臃肿
  2. 难以扩展:新增算法需要修改代码
  3. 难以维护:算法逻辑分散在代码各处

策略模式的优势

// 使用策略模式Strategystrategy=newConcreteStrategyA();strategy.execute();

优势

  1. 算法分离:每个算法独立封装
  2. 易于扩展:新增算法很容易
  3. 易于维护:算法逻辑集中管理
  4. 运行时切换:可以在运行时切换算法

策略模式的结构

┌─────────────────────┐ │ Strategy │ 策略接口 ├─────────────────────┤ │ + execute(): void │ └──────────┬──────────┘ │ 实现 ├──┬──────────────────┬──────────────┐ │ │ │ ┌──────────┴──────┐ ┌───────────┴───────┐ ┌───┴────────┐ │ ConcreteStratA │ │ ConcreteStratB │ │ ... │ 具体策略 ├─────────────────┤ ├───────────────────┤ ├────────────┤ │ + execute() │ │ + execute() │ │ │ └─────────────────┘ └───────────────────┘ └────────────┘ ┌─────────────────────┐ │ Context │ 上下文 ├─────────────────────┤ │ - strategy: Strategy│ │ + setStrategy(): │ │ void │ │ + executeStrategy() │ │ : void │ └─────────────────────┘

代码示例

1. 定义策略接口

/** * 策略接口 */publicinterfaceStrategy{/** * 执行策略 */voidexecute();}

2. 定义具体策略

/** * 具体策略:走路 */publicclassWalkStrategyimplementsStrategy{@Overridepublicvoidexecute(){System.out.println("选择走路出行,健康环保");}}/** * 具体策略:骑车 */publicclassRideStrategyimplementsStrategy{@Overridepublicvoidexecute(){System.out.println("选择骑车出行,快速便捷");}}/** * 具体策略:开车 */publicclassDriveStrategyimplementsStrategy{@Overridepublicvoidexecute(){System.out.println("选择开车出行,舒适方便");}}/** * 具体策略:坐公交 */publicclassBusStrategyimplementsStrategy{@Overridepublicvoidexecute(){System.out.println("选择坐公交出行,经济实惠");}}

3. 定义上下文

/** * 上下文:出行方式 */publicclassTravelContext{privateStrategystrategy;publicTravelContext(Strategystrategy){this.strategy=strategy;}publicvoidsetStrategy(Strategystrategy){this.strategy=strategy;}publicvoidexecuteStrategy(){strategy.execute();}}

4. 使用策略

/** * 策略模式测试类 * 演示如何使用策略模式选择不同的出行方式 */publicclassStrategyTest{publicstaticvoidmain(String[]args){System.out.println("=== 策略模式测试 ===\n");// 创建上下文TravelContextcontext=newTravelContext(newWalkStrategy());// 测试不同的策略System.out.println("--- 走路 ---");context.executeStrategy();System.out.println("\n--- 骑车 ---");context.setStrategy(newRideStrategy());context.executeStrategy();System.out.println("\n--- 开车 ---");context.setStrategy(newDriveStrategy());context.executeStrategy();System.out.println("\n--- 坐公交 ---");context.setStrategy(newBusStrategy());context.executeStrategy();System.out.println("\n=== 策略模式的优势 ===");System.out.println("1. 算法分离:每个算法独立封装");System.out.println("2. 易于扩展:新增算法很容易");System.out.println("3. 易于维护:算法逻辑集中管理");System.out.println("4. 运行时切换:可以在运行时切换算法");System.out.println("5. 避免条件语句:避免大量if-else");System.out.println("\n=== 实际应用场景 ===");System.out.println("1. 排序算法:不同的排序算法");System.out.println("2. 支付方式:不同的支付方式");System.out.println("3. 出行方式:不同的出行方式");System.out.println("4. 压缩算法:不同的压缩算法");System.out.println("5. 路由算法:不同的路由算法");System.out.println("\n=== 与状态模式的区别 ===");System.out.println("策略模式:对象在不同策略下有不同的行为");System.out.println("状态模式:对象在不同状态下有不同的行为");System.out.println("策略模式:策略之间没有转换关系");System.out.println("状态模式:状态之间有转换关系");}}

策略模式的优点

  1. 算法分离:每个算法独立封装
  2. 易于扩展:新增算法很容易
  3. 易于维护:算法逻辑集中管理
  4. 运行时切换:可以在运行时切换算法
  5. 避免条件语句:避免大量if-else

策略模式的缺点

  1. 类数量增加:每个策略都需要一个类
  2. 客户端复杂:客户端需要知道所有策略

适用场景

  1. 多个算法:有多个算法可以解决同一个问题
  2. 算法可替换:算法可以相互替换
  3. 运行时选择:需要在运行时选择算法

常见应用场景

  • 排序算法:不同的排序算法
  • 支付方式:不同的支付方式
  • 出行方式:不同的出行方式

使用建议

  • 多个算法:使用策略模式
  • 算法可替换:使用策略模式
  • 单一算法:直接调用即可

注意事项

⚠️ 策略模式虽然强大,但要注意:

  • 不要让策略过多,增加复杂度
  • 考虑使用工厂模式创建策略
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 1:57:22

设计模式——状态模式

状态模式 (State Pattern) 什么是状态模式? 状态模式是一种行为型设计模式,它允许你在对象的内部状态改变时改变它的行为。对象看起来好像改变了它的类。 简单来说:状态模式就是让对象在不同状态下有不同的行为。 生活中的例子 想象一下&…

作者头像 李华
网站建设 2026/4/18 2:07:36

DeepSeek-R1-Distill-Qwen-1.5B响应优化:首次推理加速技巧

DeepSeek-R1-Distill-Qwen-1.5B响应优化:首次推理加速技巧 你刚部署好 DeepSeek-R1-Distill-Qwen-1.5B,点下“发送”按钮,却等了足足 8 秒才看到第一个字蹦出来?别急——这不是模型慢,而是你还没打开它的“快进键”。…

作者头像 李华
网站建设 2026/4/18 2:04:09

Blazor入门第二篇之拓扑图

前面简单玩了一下在Blazor下玩耍MCP、Blazor入门第一篇之界面、API 与 MCP;今天接着来分享一下玩耍简单的拓扑图效果:1、先来看最终效果:2、绘制每一个子项网格:3、根据信号流向填充数据:4、绘制信号线连接关系:5、双击导航到指定的页面:最终简单的效果先这样吧;以后有时间的话…

作者头像 李华
网站建设 2026/4/18 3:29:16

PyTorch-2.x镜像部署指南:适合新手的保姆级教程

PyTorch-2.x镜像部署指南:适合新手的保姆级教程 1. 为什么你需要这个镜像 你是不是也经历过这些时刻? 刚装好CUDA,运行torch.cuda.is_available()却返回False; 在服务器上配Jupyter,折腾半天连端口都打不开&#xff…

作者头像 李华