news 2026/7/7 7:18:13

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

作者头像

张小明

前端开发工程师

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/7/7 8:25:29

基于Web的高校实验室药品管理系统的设计与实现开题报告

成都大学本科毕业设计&#xff08;论文&#xff09;中期检查表论文题目基于Web的高校实验室药品管理系统的设计与实现学 院计算机学院专 业物联网工程(本)学生姓名xx学  号xx指导教师xx职 称讲师/高级工程师一、工作进度情况&#xff08;检查学生的开题报告和毕业设…

作者头像 李华
网站建设 2026/7/7 9:36:49

3步搞定Codex多AI引擎切换:新手也能轻松上手

3步搞定Codex多AI引擎切换&#xff1a;新手也能轻松上手 【免费下载链接】codex 为开发者打造的聊天驱动开发工具&#xff0c;能运行代码、操作文件并迭代。 项目地址: https://gitcode.com/GitHub_Trending/codex31/codex 还在为AI模型选择困难症烦恼&#xff1f;Codex…

作者头像 李华
网站建设 2026/7/7 10:22:11

ip地址归属地查询方法(纯真ip)

项目里有获取ip地址归属地的需求&#xff0c;查了一下目前使用比较多的是纯真提供的IP地址库&#xff0c;特来记录一下。纯真(CZ88.NET)提供社区版IP地址库&#xff0c;只要获得纯真的授权就能免费使用&#xff0c;并不断获取后续更新的版本。如果有需要免费版IP库的朋友可以前…

作者头像 李华
网站建设 2026/7/7 7:10:50

EmotiVoice在游戏胜利播报中的激情释放

EmotiVoice在游戏胜利播报中的激情释放 在一场紧张激烈的MOBA对战中&#xff0c;当玩家完成五杀、推平基地的瞬间&#xff0c;耳边突然响起一段熟悉又充满激情的声音&#xff1a;“五连绝世&#xff01;你是全场最亮的星&#xff01;”——这声音不是预录好的音效&#xff0c;也…

作者头像 李华
网站建设 2026/7/7 7:38:08

18、命令行选项与类型化变量全解析

命令行选项与类型化变量全解析 1. 命令行选项处理基础 在处理命令行选项时,我们最初可能会想到类似下面这样的代码: if [ $1 = -o ]; thencode that processes the -o option1=$22=$3 fi normal processing of $1 and $2...但这段代码存在诸多问题。首先,像 1=$2 这样…

作者头像 李华
网站建设 2026/7/7 17:28:31

如何用Burp Suite高效地测试SQL注入和XSS漏洞,有什么技巧或插件推荐?

使用Burp Suite高效测试SQL注入和XSS漏洞&#xff0c;需要掌握核心模块的使用技巧&#xff0c;并配合合适的插件来提升效率。以下是详细的测试方法和工具推荐。一、SQL注入测试方法1. 基础检测流程发现注入点&#xff1a;在目标页面输入单引号或特殊字符&#xff0c;观察响应是…

作者头像 李华