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

《 Spring Boot实战:优雅构建责任链模式投诉处理业务》

Spring Boot实战:优雅构建责任链模式投诉处理业务

文章目录

  • Spring Boot实战:优雅构建责任链模式投诉处理业务
    • 场景描述:
    • 代码实现
      • Step 1: 定义投诉请求类
      • Step 2: 定义抽象处理者类
      • Step 3: 实现具体的处理者类
      • Step 4: 创建投诉处理链
      • Step 5: 创建控制器处理请求
    • 测试:通过 API 提交投诉
    • 责任链模式解决的问题
    • 总结

责任链模式 是一种行为设计模式,它允许多个对象来处理请求,而不预先指定具体的处理者。多个处理对象被连接成一条链,沿着这条链传递请求,直到某个处理对象决定处理这个请求为止。责任链模式通过将请求的发送者与接收者解耦,来提高系统的灵活性。

责任链模式原理解析:点击阅读

场景描述:

在日常开发中,请求处理链审批流程是典型的责任链模式应用场景。这里我们模拟一个场景:客户投诉处理系统。系统处理客户的投诉请求,根据投诉的严重程度,投诉会被逐级传递到不同的处理人员:

  1. 客服代表(Customer Service Representative):处理一般的轻度投诉(例如:商品延迟到达)。
  2. 客服主管(Customer Service Supervisor):处理中度投诉(例如:产品损坏)。
  3. 客服经理(Customer Service Manager):处理严重投诉(例如:客户服务态度问题,涉及到重大业务问题)。

如果某一级无法处理投诉,则投诉将沿着责任链传递给更高一级的处理者。

代码实现

我们使用 Spring Boot 来实现这个责任链模式。每个处理者(处理人员)都有自己能处理的投诉类型和级别,如果无法处理,则交给下一个处理者

Step 1: 定义投诉请求类

我们先定义一个 ComplaintRequest 类来封装客户的投诉请求,包含投诉类型、严重程度和投诉内容。

// 请求类:投诉请求
public class ComplaintRequest {private String customerName;private String complaintType;private int severityLevel;  // 投诉严重程度(1:轻度,2:中度,3:重度)private String complaintDetails;public ComplaintRequest(String customerName, String complaintType, int severityLevel, String complaintDetails) {this.customerName = customerName;this.complaintType = complaintType;this.severityLevel = severityLevel;this.complaintDetails = complaintDetails;}public String getCustomerName() {return customerName;}public String getComplaintType() {return complaintType;}public int getSeverityLevel() {return severityLevel;}public String getComplaintDetails() {return complaintDetails;}
}

Step 2: 定义抽象处理者类

所有处理人员都会实现 ComplaintHandler 接口。这个接口定义了 setNext() 方法来设置下一个处理者,以及 handleComplaint() 方法来处理投诉。

// 抽象处理者接口:投诉处理者
public abstract class ComplaintHandler {protected ComplaintHandler nextHandler;// 设置下一个处理者public void setNext(ComplaintHandler nextHandler) {this.nextHandler = nextHandler;}// 处理投诉的抽象方法public abstract void handleComplaint(ComplaintRequest request);
}

Step 3: 实现具体的处理者类

CustomerServiceRepresentativeHandler

CustomerServiceRepresentativeHandler 只能处理轻度投诉(严重程度为 1 的投诉)。

// 具体处理者:客服代表
import org.springframework.stereotype.Component;@Component
public class CustomerServiceRepresentativeHandler extends ComplaintHandler {@Overridepublic void handleComplaint(ComplaintRequest request) {if (request.getSeverityLevel() == 1) {System.out.println("Customer Service Representative handled the complaint: " + request.getComplaintDetails());} else {if (nextHandler != null) {nextHandler.handleComplaint(request);}}}
}

CustomerServiceSupervisorHandler

CustomerServiceSupervisorHandler 可以处理中度投诉(严重程度为 2 的投诉)。

// 具体处理者:客服主管
import org.springframework.stereotype.Component;@Component
public class CustomerServiceSupervisorHandler extends ComplaintHandler {@Overridepublic void handleComplaint(ComplaintRequest request) {if (request.getSeverityLevel() == 2) {System.out.println("Customer Service Supervisor handled the complaint: " + request.getComplaintDetails());} else {if (nextHandler != null) {nextHandler.handleComplaint(request);}}}
}

CustomerServiceManagerHandler

CustomerServiceManagerHandler 负责处理严重投诉(严重程度为 3 的投诉)。

// 具体处理者:客服经理
import org.springframework.stereotype.Component;@Component
public class CustomerServiceManagerHandler extends ComplaintHandler {@Overridepublic void handleComplaint(ComplaintRequest request) {if (request.getSeverityLevel() == 3) {System.out.println("Customer Service Manager handled the complaint: " + request.getComplaintDetails());} else {System.out.println("Complaint cannot be handled.");}}
}

Step 4: 创建投诉处理链

接下来,我们创建一个配置类来设置投诉处理链的顺序。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ComplaintHandlerConfig {@Beanpublic ComplaintHandler complaintHandler(CustomerServiceRepresentativeHandler repHandler,CustomerServiceSupervisorHandler supervisorHandler,CustomerServiceManagerHandler managerHandler) {// 设置责任链顺序:客服代表 -> 客服主管 -> 客服经理repHandler.setNext(supervisorHandler);supervisorHandler.setNext(managerHandler);return repHandler;  // 返回链条的第一个处理者}
}

Step 5: 创建控制器处理请求

我们通过 Spring Boot 控制器来模拟投诉请求的提交,控制器将投诉请求传递给责任链的第一个处理者。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/complaint")
public class ComplaintController {private final ComplaintHandler complaintHandler;@Autowiredpublic ComplaintController(ComplaintHandler complaintHandler) {this.complaintHandler = complaintHandler;}@PostMapping("/submit")public String submitComplaint(@RequestParam String customerName,@RequestParam String complaintType,@RequestParam int severityLevel,@RequestParam String complaintDetails) {// 创建投诉请求ComplaintRequest request = new ComplaintRequest(customerName, complaintType, severityLevel, complaintDetails);// 将投诉请求传递给责任链complaintHandler.handleComplaint(request);return "Complaint submitted!";}
}

测试:通过 API 提交投诉

我们可以通过 Postman 或 curl 来测试这个投诉处理系统。假设服务器运行在 localhost:8080

1.提交轻度投诉(严重程度为 1)

curl -X POST "http://localhost:8080/complaint/submit?customerName=John&complaintType=Delivery&severityLevel=1&complaintDetails=Package delayed"

输出结果

Customer Service Representative handled the complaint: Package delayed

2.提交中度投诉(严重程度为 2)

curl -X POST "http://localhost:8080/complaint/submit?customerName=Jane&complaintType=Product&severityLevel=2&complaintDetails=Product damaged"

输出结果

Customer Service Supervisor handled the complaint: Product damaged

3. 提交严重投诉(严重程度为 3)

curl -X POST "http://localhost:8080/complaint/submit?customerName=Alice&complaintType=Service&severityLevel=3&complaintDetails=Bad customer service experience"

输出结果

Customer Service Manager handled the complaint: Bad customer service experience

责任链模式解决的问题

  1. 职责解耦
    • 每个处理者只负责自己权限范围内的投诉,无法处理的请求会自动传递给下一个处理者。这样可以有效解耦请求发送者与接收者。
  2. 灵活扩展
    • 新增处理者非常简单,可以通过调整链条顺序或添加新的处理者来扩展系统功能,符合开闭原则
  3. 避免复杂的条件判断
    • 通过责任链模式,避免了在一个类中使用大量的 if-else 判断请求的复杂性。每个处理者只处理自己关心的请求,其他请求交给下一个处理者。

总结

通过 Spring Boot 实现的责任链模式,在客户投诉处理系统中清晰展示了如何将职责链条化。不同的处理人员各自负责不同等级的投诉请求,系统根据请求的严重程度将其逐级传递,直到找到合适的处理者。通过这种方式,我们不仅简化了处理逻辑,还提高了系统的可扩展性和灵活性。这种模式在实际开发中非常适用于类似审批流程、事件处理、异常处理等场景。

相关文章:

  • unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效、伤害等没有触发
  • 阿里云部署1Panel(失败版)
  • STM32单片机编程调试常见问题(一) HardFault_Handler故障分析与解决
  • c语言200例 64
  • 深入解析:Kubernetes 如何使用 etcd 作为配置中心和注册中心
  • MacOS Sequoia安装geant4.10.07
  • 赵长鹏今日获释,下一步会做什么?币安透露2024年加密货币牛市的投资策略!
  • 教师工作量|基于springBoot的教师工作量管理系统设计与实现(附项目源码+论文+数据库)
  • 【漏洞复现】数字通云平台智慧政务 login 存在登录绕过漏洞
  • C++ 标准模板库(STL)之集合(set)
  • GO Fsnotify学习与使用
  • 前端必知必会-jQuery 遍历 - 后代
  • 音视频生态下Unity3D和虚幻引擎(Unreal Engine)的区别
  • Excel 获取某列不为空的值【INDEX函数 | SMALL函数或 LARGE函数 | ROW函数 | ISBLANK 函数】
  • Three.js动画与交互
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • Android优雅地处理按钮重复点击
  • angular2开源库收集
  • const let
  • HTTP那些事
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • ReactNative开发常用的三方模块
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • spring boot下thymeleaf全局静态变量配置
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前端js -- this指向总结。
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 探索 JS 中的模块化
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • HanLP分词命名实体提取详解
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • # wps必须要登录激活才能使用吗?
  • ###C语言程序设计-----C语言学习(3)#
  • #HarmonyOS:基础语法
  • (20)docke容器
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)球球大作战
  • (day18) leetcode 204.计数质数
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (转)JAVA中的堆栈
  • .DFS.
  • .gitignore文件使用
  • .NET Core引入性能分析引导优化
  • .net 生成二级域名
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .pop ----remove 删除
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?