Java策略模式从入门到实战小白也能看懂的设计模式指南 一句话理解策略模式把“怎么做”抽出来让程序能灵活换算法而不改代码① 技术栈用途介绍它到底能解决什么问题想象你开了一家「智能优惠券系统」——用户下单时要根据会员等级普通/黄金/VIP自动应用不同折扣规则普通用户95折黄金用户9折VIP用户满300减50如果不用策略模式你可能写出这样的“硬编码”逻辑if (userLevel.equals(普通)) { price price * 0.95; } else if (userLevel.equals(黄金)) { price price * 0.9; } else if (userLevel.equals(VIP)) { price Math.max(0, price - 50); }✅问题来了新增「SVIP」得改if-else——违反「开闭原则」对扩展开放对修改关闭测试难、维护乱、多人协作易冲突策略模式登场把每种折扣规则封装成独立的「策略类」运行时动态选择——就像给系统装上了可插拔的「折扣引擎」✅典型场景支付方式切换微信/支付宝/银联日志输出级别控制DEBUG/INFO/WARN算法路由排序用快排/归并/堆排第三方登录QQ/微信/GitHub② 环境准备与安装配置零门槛起步无需额外安装策略模式是纯Java语言级设计思想JDK 8 即可直接使用。✅开发工具推荐任选其一IntelliJ IDEA社区版免费VS Code Extension Pack for Java✅Maven依赖如需单元测试dependency groupIdjunit/groupId artifactIdjunit/artifactId version4.13.2/version scopetest/scope /dependency⚠️新手易踩坑提醒❌ 不要试图找「策略模式.jar包」——它不是框架是编码规范❌ 不要混淆「策略」和「工厂」工厂负责创建对象策略负责封装行为二者常配合但职责不同。✅ 排查思路编译报错检查接口是否定义了方法、实现类是否implements且Override正确。③ 入门实践5分钟跑通第一个Demo▶ Step 1定义策略接口// 折扣策略接口 public interface DiscountStrategy { double calculate(double originalPrice); }▶ Step 2编写具体策略类// 普通用户策略 public class OrdinaryDiscount implements DiscountStrategy { Override public double calculate(double originalPrice) { return originalPrice * 0.95; } } // VIP策略 public class VipDiscount implements DiscountStrategy { Override public double calculate(double originalPrice) { return Math.max(0, originalPrice - 50); } }▶ Step 3创建上下文策略使用者public class OrderContext { private DiscountStrategy strategy; // 运行时注入策略 public void setStrategy(DiscountStrategy strategy) { this.strategy strategy; } public double applyDiscount(double price) { return strategy.calculate(price); } }▶ Step 4运行测试主程序public class Main { public static void main(String[] args) { OrderContext context new OrderContext(); // 切换策略只需一行代码 context.setStrategy(new OrdinaryDiscount()); System.out.println(普通用户价格 context.applyDiscount(200)); // 190.0 context.setStrategy(new VipDiscount()); System.out.println(VIP用户价格 context.applyDiscount(200)); // 150.0 } }✅ 输出普通用户价格190.0 VIP用户价格150.0✨小结你已亲手完成「策略定义→实现→注入→调用」全流程④ 进阶与原理不只是“换个类”而是掌控灵活性 高级技巧1策略工厂自动匹配public class StrategyFactory { private static final MapString, DiscountStrategy STRATEGY_MAP Map.of( ordinary, new OrdinaryDiscount(), vip, new VipDiscount() ); public static DiscountStrategy get(String type) { return STRATEGY_MAP.getOrDefault(type, new OrdinaryDiscount()); } } // 使用context.setStrategy(StrategyFactory.get(vip)); 高级技巧2结合Spring自动注入策略集合Component public class OrdinaryDiscount implements DiscountStrategy { ... } Component public class VipDiscount implements DiscountStrategy { ... } Service public class OrderService { Autowired private ListDiscountStrategy strategies; // Spring自动注入所有实现类 } 原理图景化 ┌──────────────┐ │ OrderContext│ ←─ 用户只和它交互稳定 └──────┬───────┘ │ 依赖倒置面向接口 ▼ ┌───────────────────────────┐ │ DiscountStrategy接口 │ └───────────────────────────┘ ▲ ┌───────────┴────────────┐ │ │ ┌───────────┐ ┌──────────────┐ │Ordinary │ │ Vip │ ←─ 多个实现类可无限扩展 └───────────┘ └──────────────┘✅核心思想解耦「变」与「不变」——业务流程上下文不变算法细节策略可自由替换。⑤ 总结与评估什么时候该用什么时候别硬套| 维度 | 说明 | |------------|------| | ✅优点| • 易扩展加新策略写个新类注册不碰老代码• 易测试每个策略可单独单元测试• 符合单一职责每个类只干一件事一种算法 | | ⚠️局限性| • 类数量增多一个策略一个类→ 小项目可能“杀鸡用牛刀”• 策略间无状态共享 → 如需共享数据需通过上下文传参或引入状态管理 | | 适用场景| • 同一问题有多种算法实现• 算法需要在运行时动态切换• 避免大量条件判断if-else / switch | | 对比其他模式| • vs 状态模式策略关注「算法选择」状态关注「对象行为随状态改变」• vs 模板方法策略是「行为委托」模板是「继承复用」 | 后续学习建议✅ 动手改造把你项目里的if-else折扣逻辑用策略模式重写一遍✅ 拓展阅读《Head First 设计模式》第1章图文超友好✅ 进阶挑战用策略模式实现「不同地区运费计算规则」江浙沪/偏远地区/海外最后送你一句心法“设计模式不是为了炫技而是当你发现‘又在复制粘贴if-else’时心里突然亮起的一盏灯。”欢迎留言交流你的策略模式踩坑/妙用案例