当前位置: 首页 > news >正文

日常练习

本次练习关于使用设计模式改善代码。

我把曾经我写过的代码找了出来,发现我以前写的代码,发现结构极其臃肿,并且每次修改都可能应为连锁反应导致错误。

在其中的在OrderService类中:

public class OrderService {public String processOrder(String orderId, String userId, String paymentType, String deliveryType, int couponId, boolean isUrgent, Map<String, Object> extraParams) {// 包含了订单验证、支付处理、库存检查、物流安排、优惠计算...}
}

我使用IDEA的Diagram工具生成方法调用关系图:
// 先用注释标记代码段
// [1] 参数验证段:87行(第1-87行)
// [2] 支付处理段:213行(第88-300行)
// [3] 库存锁定段:156行(第301-456行)
// ...

我发现方法中存在8个重复的“地址校验”逻辑块,每个约45行代码。
提取验证层:

// 创建第一个独立类:参数验证器
public class OrderValidator {// 策略模式:不同类型的验证策略private List<ValidationStrategy> strategies;public ValidationResult validate(OrderContext context) {// 将87行验证代码重构为策略集合return strategies.stream().map(s -> s.validate(context)).filter(r -> !r.isValid()).findFirst().orElse(ValidationResult.valid());}
}
// 策略接口
public interface ValidationStrategy {ValidationResult validate(OrderContext context);
}// 具体策略:地址验证(提取重复代码)
public class AddressValidationStrategy implements ValidationStrategy {@Overridepublic ValidationResult validate(OrderContext context) {// 原来45行重复代码 -> 精简为15行if (context.getAddress() == null) {return ValidationResult.invalid("地址不能为空");}// ... 其他验证逻辑return checkAddressFormat(context.getAddress());}private ValidationResult checkAddressFormat(Address addr) {// 抽取的公共方法}
}

这样就精简了大概300行的代码。

在我的代码中还有这样的结构:

// 原始代码片段
if ("credit_card".equals(paymentType)) {// 120行信用卡处理逻辑sendCreditCardRequest(order);logCreditCardOperation(order);updateCreditCardBalance(order);
} else if ("paypal".equals(paymentType)) {// 95行PayPal处理逻辑initPayPalPayment(order);verifyPayPalCallback(order);// ... 结构类似但实现不同
} else if ("campus_card".equals(paymentType)) {// 82行校园卡处理逻辑// ...
}

首先我使用策略模式解耦支付逻辑:

// 支付策略接口
public interface PaymentStrategy {PaymentResult pay(Order order);PaymentType getType();
}// 具体策略
public class CreditCardStrategy implements PaymentStrategy {@Overridepublic PaymentResult pay(Order order) {// 原120行代码重构PaymentProcessor processor = new CreditCardProcessor();return processor.process(order);}
}// 策略工厂
public class PaymentStrategyFactory {private Map<PaymentType, PaymentStrategy> strategies;public PaymentStrategy getStrategy(PaymentType type) {return strategies.get(type);}
}

我又发现所有支付方式都有相同步骤,于是统一处理流程:

// 模板抽象类
public abstract class PaymentTemplate {// 模板方法:定义算法骨架public final PaymentResult execute(Order order) {validate(order);        // 步骤1PaymentResult result = doPay(order); // 抽象方法logPayment(result);     // 步骤3return result;}protected abstract PaymentResult doPay(Order order);protected void validate(Order order) {// 公共验证逻辑}protected void logPayment(PaymentResult result) {// 公共日志逻辑}
}

这样一整套操作下来,我的代码精简了非常多,且利于更改。

http://www.jsqmd.com/news/348935/

相关文章:

  • 查重爆表?AI检测亮红灯?别慌!百考通「降重+降AI」来给你论文“一键真人化+学术美颜”啦~
  • pg连接数问题
  • 计算机毕业设计|基于springboot + vue医院管理系统(源码+数据库+文档)
  • Java和.NET的核心差异 - 实践
  • 查重太高?AI检测报警?别emo了!百考通「降重+降AI」来给你论文“一键真人认证+学术柔光滤镜”啦~
  • 2026年2月电力电缆生产厂家推荐,覆盖中低压、低压、中压、变频等电缆生产厂家名单盘点 - 品牌2025
  • 计算机毕业设计|基于springboot + vue校园二手交易系统(源码+数据库+文档)
  • ESP32S3 VSCode环境
  • 波动即机遇:2026新能源电力交易,将“准而不稳”转化为可控风险的三大破局点
  • 查重飙高?AI检测拉警报?别慌!百考通「降重+降AI」来给你论文“一键真人化+学术柔光”啦~
  • 计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
  • 移动化ERP,随时随地优化企业资源
  • 计算机毕业设计|基于springboot + vue考试管理系统(源码+数据库+文档)
  • 【预测可用功率】新规下的博弈:拆解2026电力市场“可用功率”与“实发功率”的管理迷思
  • file_operations中的poll方法
  • 2026年软件测试公众号热点解析:多智能体工具在需求冲突检测中的崛起
  • 升级人力资源系统,解锁企业人才管理新机遇
  • GitHub 热榜项目 - 日榜(2026-02-06)
  • 百考通AI:智能数据分析,让数据决策更高效精准
  • 从流水线到LOVE:一个MIPS32软核的奇幻漂流
  • 百考通AI:答辩PPT一键生成,让你的学术成果惊艳全场
  • NeRF+SLAM技术融合在AR导航测试中的核心价值
  • 2026年口碑好的LABELKING柔版印刷机/数码组合柔版印刷机用户口碑认可参考(高评价) - 行业平台推荐
  • 百考通AI:任务书一键生成,为学术研究锚定清晰航向
  • springboot基于java的电影评分系统(源码+文档+运行视频+讲解视频)
  • 量子机器学习测试:变分量子分类器的经典仿真验证工具链
  • springboot基于java的动漫手办商城系统(源码+文档+运行视频+讲解视频)
  • 联邦学习隐私盾:差分隐私测试工具在跨机构模型更新中的实战评估—— 解析泄露风险量化技术与测试实践路径
  • 2026年质量好的青花瓷轮转印刷机/伺服卫星式轮转印刷机厂家质量参考评选 - 行业平台推荐
  • springboot基于Java的大学生入伍人员管理系统征兵宣传国防教育(源码+文档+运行视频+讲解视频)