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

news/2024/9/28 19:33:12 标签: spring boot, 责任链模式, python, 设计模式

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 {

    @Override
    public 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 {

    @Override
    public 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 {

    @Override
    public 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 {

    @Bean
    public 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;

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


http://www.niftyadmin.cn/n/5681719.html

相关文章

基于Hive和Hadoop的哔哩哔哩网站分析系统

本项目是一个基于大数据技术的哔哩哔哩平台分析系统,旨在为用户提供全面的哔哩哔哩视频数据和深入的用户行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出&#xf…

如何评估婚恋交友小程序的投资回报率

在这个数字化的时代,越来越多的人选择通过手机应用程序寻找自己的另一半。随着婚恋交友小程序的兴起,编辑h17711347205如何评估这类产品的投资回报率(ROI)成为了投资者和运营者关注的重点。本文将探讨如何有效地评估婚恋交友小程序…

如何构建鲁棒高性能 Prompt 的方法?

你好,我是三桥君 在当今时代,利用大型语言模型如ChatGPT进行文本生成和交互已成为一种趋势。然而,要充分发挥这些模型的能力,尤其是在生产环境中,我们需要精心设计和优化我们的提示词(prompt)。…

【C语言】动态内存管理:malloc、calloc、realloc、free

本篇介绍一下C语言中的malloc/calloc/realloc。 使用这些函数需要包含头文件<stdlib.h>。malloc/calloc/realloc申请的空间都是 堆区的。 1.malloc和free 1.1 malloc C语言提供了一个动态内存开辟的函数malloc&#xff0c;函数原型如下。 void* malloc(size_t size);…

汽车总线之---- LIN总线

Introduction LIN总线的简介&#xff0c;对于传统的这种点对点的连接方式&#xff0c;我们可以看到ECU相关的传感器和执行器是直接连接到ECU的&#xff0c;当传感器和执行器的数量较少时&#xff0c;这样的连接方式是能满足要求的&#xff0c;但是随着汽车电控功能数量的不断增…

代码为笔,合作作墨,共绘共赢画卷———未来之窗行业应用跨平台架构

合作共赢&#xff0c;代码同创&#xff0c;成就非凡 一、资源整合方面 1.1. 技术资源共享 - 不同的合作伙伴可能在技术领域各有所长。例如&#xff0c;一方可能擅长前端用户界面设计&#xff0c;具有丰富的交互设计经验&#xff0c;能够打造出美观、易用的预订界面&#xff…

linux 目录文件夹操作

目录 移动绝对目录&#xff1a; 移动相对目录 test.py报错&#xff1a; 移动绝对目录&#xff1a; mv -f /lpai/log /data data目录下会有一个目录log 移动相对目录 mv ./segmentation_results /lpai/volumes/ad-op-ga/code/ap_pose/AG-Pose-main/data test.py报错&#…

PaddleOCR 表格识别,docker部署,cpu版本

前置环境 centeros7 docker 拉取镜像 docker pull registry.baidubce.com/paddlepaddle/paddle:2.6.1 参考&#xff1a;开始使用_飞桨-源于产业实践的开源深度学习平台 这里拉取的镜像并不能立马用&#xff0c;只是内置好运行环境 随便找个目录下载paddleocr的代码 git…