文章目录前言一、概念二、核心结构三、Java 代码实现促销打折场景1. 抽象策略接口2. 具体策略实现① 正常价格② 满减策略③ 折扣策略④ 秒杀策略3. 上下文类负责持有并执行策略4. 客户端调用四、策略模式优化配合工厂 枚举消灭 if-else五、策略模式 VS 模板方法模式高频面试题六、优缺点优点缺点七、应用场景八、总结前言在业务开发中我们经常会遇到同一行为、多种实现方案的场景比如支付方式微信/支付宝/银联、促销策略原价/满减/折扣/秒杀、排序算法快排/归并/冒泡、文件压缩ZIP/RAR/7Z等。如果用大量if-else或switch硬编码代码会臃肿、难以维护、扩展麻烦也严重违背开闭原则。策略模式就是专门解决这类多种算法自由切换、避免大量条件判断的行为型设计模式。一、概念策略模式Strategy Pattern是一种行为型设计模式核心思想定义一系列算法策略将每个算法封装起来使它们可以互相替换让算法的变化独立于使用算法的客户端。简单理解把每一种实现方案都封装成一个策略类对外提供统一接口客户端按需选择、随时替换彻底消灭臃肿的if-else / switch。一句话总结一组可互换算法 动态切换 策略模式。二、核心结构Strategy抽象策略定义策略通用接口所有具体策略都必须实现。ConcreteStrategy具体策略实现抽象策略接口提供具体算法/业务逻辑。Context上下文/环境类持有策略引用负责调度策略对外提供统一调用入口。Client客户端创建具体策略设置到 Context 中执行逻辑。三、Java 代码实现促销打折场景场景订单结算支持多种促销方式正常价格无优惠满减优惠折扣优惠秒杀价1. 抽象策略接口publicinterfacePromoteStrategy{// 计算最终价格doublecalculatePrice(doubleoriginalPrice);}2. 具体策略实现① 正常价格publicclassNormalStrategyimplementsPromoteStrategy{OverridepublicdoublecalculatePrice(doubleoriginalPrice){System.out.println(无优惠原价结算);returnoriginalPrice;}}② 满减策略publicclassFullReductionStrategyimplementsPromoteStrategy{OverridepublicdoublecalculatePrice(doubleoriginalPrice){if(originalPrice200){System.out.println(满200减50);returnoriginalPrice-50;}System.out.println(未满200不享受满减);returnoriginalPrice;}}③ 折扣策略publicclassDiscountStrategyimplementsPromoteStrategy{OverridepublicdoublecalculatePrice(doubleoriginalPrice){System.out.println(8折优惠);returnoriginalPrice*0.8;}}④ 秒杀策略publicclassSeckillStrategyimplementsPromoteStrategy{OverridepublicdoublecalculatePrice(doubleoriginalPrice){System.out.println(秒杀价固定立减100);returnMath.max(originalPrice-100,0);}}3. 上下文类负责持有并执行策略publicclassOrderContext{// 持有策略privatePromoteStrategystrategy;// 动态设置策略publicvoidsetStrategy(PromoteStrategystrategy){this.strategystrategy;}// 统一结算入口publicdoublesettle(doubleprice){if(strategynull){thrownewRuntimeException(请设置优惠策略);}returnstrategy.calculatePrice(price);}}4. 客户端调用publicclassClient{publicstaticvoidmain(String[]args){OrderContextcontextnewOrderContext();doubleprice200;// 1. 原价context.setStrategy(newNormalStrategy());System.out.println(最终价context.settle(price));System.out.println(----------------);// 2. 满减context.setStrategy(newFullReductionStrategy());System.out.println(最终价context.settle(price));System.out.println(----------------);// 3. 折扣context.setStrategy(newDiscountStrategy());System.out.println(最终价context.settle(price));System.out.println(----------------);// 4. 秒杀context.setStrategy(newSeckillStrategy());System.out.println(最终价context.settle(price));}}输出结果无优惠原价结算 最终价200.0 ---------------- 满200减50 最终价150.0 ---------------- 8折优惠 最终价160.0 ---------------- 秒杀价固定立减100 最终价100.0四、策略模式优化配合工厂 枚举消灭 if-else实际项目中通常会用枚举 工厂来根据类型自动获取策略彻底告别条件判断。这是后端最常用的工程化写法publicclassStrategyFactory{privatestaticfinalMapString,PromoteStrategyMAPnewHashMap();static{MAP.put(normal,newNormalStrategy());MAP.put(full,newFullReductionStrategy());MAP.put(discount,newDiscountStrategy());MAP.put(seckill,newSeckillStrategy());}publicstaticPromoteStrategygetStrategy(Stringtype){returnMAP.get(type);}}客户端直接PromoteStrategystrategyStrategyFactory.getStrategy(seckill);五、策略模式 VS 模板方法模式高频面试题对比点策略模式模板方法模式实现方式组合/委托继承关注点一组平等算法自由切换固定流程骨架 可变步骤扩展性新增策略无需改动旧代码新增实现需继承模板耦合度低策略可随时替换较高子类依赖父类典型场景支付、促销、压缩、排序登录流程、支付流程、工作流六、优缺点优点完美消除大量 if-else / switch代码清爽易维护符合开闭原则新增策略只需新增类不改动旧代码算法自由切换、动态替换灵活性极强单一职责每个策略只做一件事缺点策略类数量会增多每种策略一个类客户端必须知道所有策略自行选择使用哪一个只适用于策略平等、可互换的场景七、应用场景凡是同一行为有多种实现、需要动态切换、不想写if-else的场景支付策略微信/支付宝/银联/PayPal促销优惠满减/折扣/秒杀/优惠券加密/压缩算法AES/RSA、ZIP/RAR/7Z登录方式账号密码/短信/微信/支付宝排序策略快排/归并/插入经典框架应用JavaComparator比较器策略切换排序规则SpringResource加载策略Spring MVCHandlerMapping、HandlerAdapterThreadPoolExecutor 拒绝策略Abort/CallerRuns 等八、总结策略模式 封装一组可互换算法 动态切换核心用多态替代 if-else结构抽象策略 具体策略 上下文工程最佳实践策略 工厂 枚举/Map彻底消灭条件判断是业务开发中最常用、最实用、面试最高频的行为型模式之一
【设计模式】行为型-策略模式
发布时间:2026/5/24 7:19:59
文章目录前言一、概念二、核心结构三、Java 代码实现促销打折场景1. 抽象策略接口2. 具体策略实现① 正常价格② 满减策略③ 折扣策略④ 秒杀策略3. 上下文类负责持有并执行策略4. 客户端调用四、策略模式优化配合工厂 枚举消灭 if-else五、策略模式 VS 模板方法模式高频面试题六、优缺点优点缺点七、应用场景八、总结前言在业务开发中我们经常会遇到同一行为、多种实现方案的场景比如支付方式微信/支付宝/银联、促销策略原价/满减/折扣/秒杀、排序算法快排/归并/冒泡、文件压缩ZIP/RAR/7Z等。如果用大量if-else或switch硬编码代码会臃肿、难以维护、扩展麻烦也严重违背开闭原则。策略模式就是专门解决这类多种算法自由切换、避免大量条件判断的行为型设计模式。一、概念策略模式Strategy Pattern是一种行为型设计模式核心思想定义一系列算法策略将每个算法封装起来使它们可以互相替换让算法的变化独立于使用算法的客户端。简单理解把每一种实现方案都封装成一个策略类对外提供统一接口客户端按需选择、随时替换彻底消灭臃肿的if-else / switch。一句话总结一组可互换算法 动态切换 策略模式。二、核心结构Strategy抽象策略定义策略通用接口所有具体策略都必须实现。ConcreteStrategy具体策略实现抽象策略接口提供具体算法/业务逻辑。Context上下文/环境类持有策略引用负责调度策略对外提供统一调用入口。Client客户端创建具体策略设置到 Context 中执行逻辑。三、Java 代码实现促销打折场景场景订单结算支持多种促销方式正常价格无优惠满减优惠折扣优惠秒杀价1. 抽象策略接口publicinterfacePromoteStrategy{// 计算最终价格doublecalculatePrice(doubleoriginalPrice);}2. 具体策略实现① 正常价格publicclassNormalStrategyimplementsPromoteStrategy{OverridepublicdoublecalculatePrice(doubleoriginalPrice){System.out.println(无优惠原价结算);returnoriginalPrice;}}② 满减策略publicclassFullReductionStrategyimplementsPromoteStrategy{OverridepublicdoublecalculatePrice(doubleoriginalPrice){if(originalPrice200){System.out.println(满200减50);returnoriginalPrice-50;}System.out.println(未满200不享受满减);returnoriginalPrice;}}③ 折扣策略publicclassDiscountStrategyimplementsPromoteStrategy{OverridepublicdoublecalculatePrice(doubleoriginalPrice){System.out.println(8折优惠);returnoriginalPrice*0.8;}}④ 秒杀策略publicclassSeckillStrategyimplementsPromoteStrategy{OverridepublicdoublecalculatePrice(doubleoriginalPrice){System.out.println(秒杀价固定立减100);returnMath.max(originalPrice-100,0);}}3. 上下文类负责持有并执行策略publicclassOrderContext{// 持有策略privatePromoteStrategystrategy;// 动态设置策略publicvoidsetStrategy(PromoteStrategystrategy){this.strategystrategy;}// 统一结算入口publicdoublesettle(doubleprice){if(strategynull){thrownewRuntimeException(请设置优惠策略);}returnstrategy.calculatePrice(price);}}4. 客户端调用publicclassClient{publicstaticvoidmain(String[]args){OrderContextcontextnewOrderContext();doubleprice200;// 1. 原价context.setStrategy(newNormalStrategy());System.out.println(最终价context.settle(price));System.out.println(----------------);// 2. 满减context.setStrategy(newFullReductionStrategy());System.out.println(最终价context.settle(price));System.out.println(----------------);// 3. 折扣context.setStrategy(newDiscountStrategy());System.out.println(最终价context.settle(price));System.out.println(----------------);// 4. 秒杀context.setStrategy(newSeckillStrategy());System.out.println(最终价context.settle(price));}}输出结果无优惠原价结算 最终价200.0 ---------------- 满200减50 最终价150.0 ---------------- 8折优惠 最终价160.0 ---------------- 秒杀价固定立减100 最终价100.0四、策略模式优化配合工厂 枚举消灭 if-else实际项目中通常会用枚举 工厂来根据类型自动获取策略彻底告别条件判断。这是后端最常用的工程化写法publicclassStrategyFactory{privatestaticfinalMapString,PromoteStrategyMAPnewHashMap();static{MAP.put(normal,newNormalStrategy());MAP.put(full,newFullReductionStrategy());MAP.put(discount,newDiscountStrategy());MAP.put(seckill,newSeckillStrategy());}publicstaticPromoteStrategygetStrategy(Stringtype){returnMAP.get(type);}}客户端直接PromoteStrategystrategyStrategyFactory.getStrategy(seckill);五、策略模式 VS 模板方法模式高频面试题对比点策略模式模板方法模式实现方式组合/委托继承关注点一组平等算法自由切换固定流程骨架 可变步骤扩展性新增策略无需改动旧代码新增实现需继承模板耦合度低策略可随时替换较高子类依赖父类典型场景支付、促销、压缩、排序登录流程、支付流程、工作流六、优缺点优点完美消除大量 if-else / switch代码清爽易维护符合开闭原则新增策略只需新增类不改动旧代码算法自由切换、动态替换灵活性极强单一职责每个策略只做一件事缺点策略类数量会增多每种策略一个类客户端必须知道所有策略自行选择使用哪一个只适用于策略平等、可互换的场景七、应用场景凡是同一行为有多种实现、需要动态切换、不想写if-else的场景支付策略微信/支付宝/银联/PayPal促销优惠满减/折扣/秒杀/优惠券加密/压缩算法AES/RSA、ZIP/RAR/7Z登录方式账号密码/短信/微信/支付宝排序策略快排/归并/插入经典框架应用JavaComparator比较器策略切换排序规则SpringResource加载策略Spring MVCHandlerMapping、HandlerAdapterThreadPoolExecutor 拒绝策略Abort/CallerRuns 等八、总结策略模式 封装一组可互换算法 动态切换核心用多态替代 if-else结构抽象策略 具体策略 上下文工程最佳实践策略 工厂 枚举/Map彻底消灭条件判断是业务开发中最常用、最实用、面试最高频的行为型模式之一