news 2026/5/19 21:11:53

【设计优化】卫语句、策略模式、状态模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【设计优化】卫语句、策略模式、状态模式

在写业务代码时,可能出现多层 if / else,通常意味着以下问题之一或并存:
1.分支条件复杂、可读性差
2.业务规则易变、修改成本高
3.单一方法承担过多职责
卫语句、策略模式、状态模式正是针对不同“分支复杂性来源”而采用的三种典型重构手段。

一.卫语句

1.适用场景
“不满足条件就立即返回 / 抛异常”

适合用于:参数校验,前置条件校验,明显的异常路径,早退出逻辑
典型特征:if 之间没有状态变化,只是为了过滤非法情况,分支不代表不同业务策略

2.原始代码

publicdecimalCalculatePrice(Orderorder){if(order!=null){if(order.Items!=null&&order.Items.Count>0){if(!order.IsCanceled){returnorder.Items.Sum(x=>x.Price);}}}return0;}

3.卫语句重构

publicdecimalCalculatePrice(Orderorder){if(order==null)return0;if(order.Items==null||order.Items.Count==0)return0;if(order.IsCanceled)return0;returnorder.Items.Sum(x=>x.Price);}

4.优缺点

  • 极低改造成本
  • 可读性显著提升
  • 非常适合方法开头
  • 不能解决真正的业务分支爆炸
  • 不适合“不同规则 / 不同行为”的分支

二、策略模式(Strategy Pattern)

  1. 适用场景
    “同一件事,不同算法 / 不同规则”

判断标准:if / else 中每个分支:都是在“做同一件事”,但实现逻辑不同,业务规则未来可能扩展
典型示例:价格计算,折扣规则,运费计算,权限校验规则

  1. 原始 if / else 示例
publicdecimalCalculateDiscount(Orderorder){if(order.CustomerType==CustomerType.Vip)returnorder.Total*0.8m;elseif(order.CustomerType==CustomerType.Normal)returnorder.Total*0.9m;elseif(order.CustomerType==CustomerType.New)returnorder.Total;elsereturnorder.Total;}
  1. 使用策略模式
//① 抽象策略接口publicinterfaceIDiscountStrategy{decimalCalculate(Orderorder);}//② 具体策略实现publicclassVipDiscountStrategy:IDiscountStrategy{publicdecimalCalculate(Orderorder)=>order.Total*0.8m;}publicclassNormalDiscountStrategy:IDiscountStrategy{publicdecimalCalculate(Orderorder)=>order.Total*0.9m;}publicclassNewCustomerDiscountStrategy:IDiscountStrategy{publicdecimalCalculate(Orderorder)=>order.Total;}//③ 策略选择(替代 if / else)publicclassDiscountStrategyFactory{privatestaticreadonlyDictionary<CustomerType,IDiscountStrategy>_strategies=new(){{CustomerType.Vip,newVipDiscountStrategy()},{CustomerType.Normal,newNormalDiscountStrategy()},{CustomerType.New,newNewCustomerDiscountStrategy()}};publicstaticIDiscountStrategyGet(CustomerTypetype)=>_strategies[type];}//④ 调用varstrategy=DiscountStrategyFactory.Get(order.CustomerType);vardiscount=strategy.Calculate(order);
  1. 优缺点
  • 可扩展性极强
  • 每个策略逻辑清晰
  • 易测试、易维护
  • 类数量增加
  • 初期显得“设计偏重”
  • 需要额外的策略选择机制

三、状态模式(State Pattern)

  1. 适用场景
    “对象行为随状态变化而变化”

判断标准:if / else 依据的是 当前状态,同一方法在不同状态下行为不同,状态之间存在流转关系
典型示例:订单状态(新建 / 已支付 / 已发货 / 已取消),工作流,审批流程,设备状态(开机 / 关机 / 待机)

  1. 原始 if / else 示例
publicvoidPay(Orderorder){if(order.Status==OrderStatus.Created){order.Status=OrderStatus.Paid;}elseif(order.Status==OrderStatus.Paid){thrownewException("订单已支付");}elseif(order.Status==OrderStatus.Canceled){thrownewException("订单已取消");}}
  1. 使用状态模式
//① 状态接口publicinterfaceIOrderState{voidPay(OrderContextcontext);}//② 状态上下文publicclassOrderContext{publicIOrderStateState{get;set;}publicvoidPay(){State.Pay(this);}}//③ 具体状态publicclassCreatedState:IOrderState{publicvoidPay(OrderContextcontext){context.State=newPaidState();}}publicclassPaidState:IOrderState{publicvoidPay(OrderContextcontext){thrownewInvalidOperationException("订单已支付");}}publicclassCanceledState:IOrderState{publicvoidPay(OrderContextcontext){thrownewInvalidOperationException("订单已取消");}}
  1. 优缺点
  • 彻底消除状态判断
  • 状态逻辑高度内聚
  • 对复杂流程极友好
  • 类数量显著增加
  • 不适合简单状态
  • 初学者理解成本高

四、三者核心对比总结

维度卫语句策略模式状态模式
解决什么问题前置校验、异常路径不同算法/规则状态驱动行为
是否消除 if
是否面向对象
类数量不变增加大量增加
是否有状态流转
扩展性
使用成本极低

完结撒花~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/18 15:55:13

百度网盘秒传工具终极使用指南:新手快速入门完整教程

百度网盘秒传工具终极使用指南&#xff1a;新手快速入门完整教程 【免费下载链接】baidupan-rapidupload 百度网盘秒传链接转存/生成/转换 网页工具 (全平台可用) 项目地址: https://gitcode.com/gh_mirrors/bai/baidupan-rapidupload 如果您曾经为百度网盘文件分享的繁…

作者头像 李华
网站建设 2026/5/14 20:35:05

EmotiVoice在直播带货中的促销语音模板

EmotiVoice在直播带货中的情感化语音生成实践 在电商直播日益激烈的今天&#xff0c;一个主播能否“把人留住”&#xff0c;往往不在于说了什么&#xff0c;而在于怎么说。一句平淡的“这款面膜补水效果很好”&#xff0c;和一句充满激情的“姐妹们&#xff01;这瓶精华涂上去就…

作者头像 李华
网站建设 2026/5/16 8:52:06

高并发电商实战:基于Java生态的多元化盲盒系统技术实现方案

高并发电商实战&#xff1a;基于Java生态的多元化盲盒系统技术实现方案源码:shuai.68api.cn随着潮玩电商的快速迭代&#xff0c;传统的脚本语言架构在面对瞬时高并发、复杂逻辑扩展以及分布式事务时&#xff0c;往往面临性能瓶颈。本文将深入剖析一套基于Java旗舰级技术栈实现的…

作者头像 李华
网站建设 2026/5/19 9:14:46

零基础入门EmotiVoice:新手快速上手教程

零基础入门EmotiVoice&#xff1a;新手快速上手教程 你有没有想过&#xff0c;只需几秒钟的录音&#xff0c;就能让AI“说”出和你一模一样的声音&#xff1f;还能让它带着喜悦、愤怒或悲伤的情绪朗读任何文字&#xff1f;这不再是科幻电影里的桥段——EmotiVoice 正在将这种能…

作者头像 李华
网站建设 2026/5/16 20:48:13

FindSomething信息提取插件终极指南:浏览器隐私安全完整教程

在当今数字化时代&#xff0c;网页浏览过程中个人信息泄露风险日益严峻。FindSomething作为一款基于Chrome和Firefox平台的被动式信息泄漏检测工具&#xff0c;通过智能算法实时监控网页内容&#xff0c;为您的网络安全提供全方位防护。&#x1f512; 【免费下载链接】FindSome…

作者头像 李华
网站建设 2026/5/1 9:58:25

高效Bandcamp下载完整指南:快速获取高品质音乐的便捷方法

高效Bandcamp下载完整指南&#xff1a;快速获取高品质音乐的便捷方法 【免费下载链接】bandcamp-dl Simple python script to download Bandcamp albums 项目地址: https://gitcode.com/gh_mirrors/ba/bandcamp-dl bandcamp-dl是一个功能强大的Python命令行工具&#xf…

作者头像 李华