news 2026/4/3 4:12:40

设计模式——策略模式

作者头像

张小明

前端开发工程师

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/3/30 21:40:29

国产电车正在重蹈国产手机的覆辙,肆意妄为导致国人厌弃!

这几年国产电车可谓顺风顺水,市场份额激增,外资车占有的市场份额被挤压至三成左右,志得意满之下,一些国产电车企业开始暴露了贪婪嘴脸,对国内消费者可谓肆意妄为,然而他们需要当心当年国产手机的一幕可能重…

作者头像 李华
网站建设 2026/4/1 22:31:44

中小企业如何用verl?低成本强化学习落地指南

中小企业如何用verl?低成本强化学习落地指南 1. verl 是什么:专为LLM后训练设计的轻量级RL框架 你可能听说过强化学习(RL)在大模型对齐中的关键作用——比如让模型更懂人类偏好、更愿意配合指令、更少胡说八道。但一提到“RL训练…

作者头像 李华
网站建设 2026/3/21 14:34:49

FanControl智能调控完全指南:从噪音困扰到静音体验的转变

FanControl智能调控完全指南:从噪音困扰到静音体验的转变 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending…

作者头像 李华
网站建设 2026/4/1 6:10:35

用SGLang生成标准JSON,数据处理更方便

用SGLang生成标准JSON,数据处理更方便 你是否写过这样的代码:调用大模型API,拿到一串看似JSON、实则夹杂解释文字的响应,再花半小时写正则或json.loads()加异常捕获去“抢救”结构化数据?又或者,为让模型输…

作者头像 李华
网站建设 2026/3/31 23:33:49

OpCore Simplify 小白通关秘籍:跨平台应用的7个实用技巧

OpCore Simplify 小白通关秘籍:跨平台应用的7个实用技巧 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 第1章:痛点分析——跨…

作者头像 李华