责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例
需求:后端需要提供一个文章发布的接口,接口中需要先对文章内容进行如下校验,校验通过后才能发布
1. 文章长度不能超过1万个字符
2. 不能有敏感词
3. 文章中图片需要合规
责任链相当于一个链条一样,链条上有很多节点,节点与节点之间形成了一个单向的链表。
每个节点相当于一个处理步骤,一个任务过来后,会交给链条上第一个节点进行处理,第一个节点处理后再传递给下一个节点,下一个节点处理完成后,继续向后传递。
目前文章发布中的校验有下面3个步骤,每个步骤相当于责任链上一个节点,每个步骤对应一个类,如果要进行扩展,只需要添加一个类,然后调整下链表的顺序便可。
具体实现
1 pom.xml
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>
2 pojo类,ArticlePublishRequest: 数据传输对象,封装了文章发布请求的数据。
import lombok.Data;@Data
public class ArticlePublishRequest {// 文章内容private String content;
}
3 IArticlePublishCheck: 定义文章发布校验的接口,包含校验和设置下一个校验器的方法
import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
public interface IArticlePublishCheck {/*** 对文章进行校验** @param req*/void check(ArticlePublishRequest req);/*** 设置下一个文章校验器,并返回下一个校验器** @param next* @return*/IArticlePublishCheck setNext(IArticlePublishCheck next);
}
4 AbstractCheck: 提供责任链模式的抽象实现,包含默认的校验流程和设置下一个校验器的逻辑
import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;public abstract class AbstractCheck implements IArticlePublishCheck {private IArticlePublishCheck next;@Overridepublic void check(ArticlePublishRequest req) {//校验this.checkIn(req);//调用下一个校验器进行校验if (this.next != null) {this.next.check(req);}}/*** 子类实现** @param req*/protected abstract void checkIn(ArticlePublishRequest req);@Overridepublic IArticlePublishCheck setNext(IArticlePublishCheck next) {this.next = next;return this.next;}
}
5 校验具体实现类
-
ContentLengthCheck: 实现内容长度校验,确保文章内容长度在合理范围内。
-
ImageCheck: 实现图片合法性校验,确保文章中的图片是合法的(当前未实现具体逻辑)。
-
PublishCountCheck: 实现发布次数校验,限制用户每天发布文章的数量。
-
SensitiveWordsCheck: 实现敏感词校验,确保文章内容不包含敏感词汇。
import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
import org.apache.commons.lang3.StringUtils;/*** 内容长度校验*/
public class ContentLengthCheck extends AbstractCheck {@Overrideprotected void checkIn(ArticlePublishRequest req) {if (StringUtils.length(req.getContent()) < 1 || StringUtils.length(req.getContent()) > 10) {throw new RuntimeException("文章长度不能超过10000个字符");}}
}---------------------------------------------import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
/*** 图片合法性校验*/
public class ImageCheck extends AbstractCheck {@Overrideprotected void checkIn(ArticlePublishRequest req) {//校验图片是否合法?不合法则抛出异常boolean checked = true;if (!checked) {throw new RuntimeException("图片不合法");}}
}---------------------------------------------import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
import java.util.concurrent.atomic.AtomicInteger;/*** 发布次数校验器,每日限制5篇文章*/
public class PublishCountCheck extends AbstractCheck {AtomicInteger publishCount = new AtomicInteger(0);@Overrideprotected void checkIn(ArticlePublishRequest req) {if (publishCount.incrementAndGet() > 5) {//发布次数校验,比如每日只允许发布5篇文章throw new RuntimeException("今日发布已满,请明日继续分享!");}}
}---------------------------------------------import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
import java.util.Arrays;
import java.util.List;/*** 敏感词校验*/
public class SensitiveWordsCheck extends AbstractCheck {@Overrideprotected void checkIn(ArticlePublishRequest req) {//敏感词列表List<String> sensitiveWordsList = Arrays.asList("逼");//有敏感词则抛出异常for (String sw : sensitiveWordsList) {if (req.getContent().contains(sw)) {throw new RuntimeException("有敏感词:" + sw);}}}
}
6 ArticleCheckConfig: 配置类,负责创建和配置责任链中各个校验器,并设置它们之间的顺序。
import com.example.demo_23.aaaaa.article.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class ArticleCheckConfig {@Beanpublic ContentLengthCheck contentLengthCheck() {return new ContentLengthCheck();}@Beanpublic SensitiveWordsCheck sensitiveWordsCheck() {return new SensitiveWordsCheck();}@Beanpublic ImageCheck imageCheck() {return new ImageCheck();}@Beanpublic PublishCountCheck publishCountCheck() {return new PublishCountCheck();}@Beanpublic IArticlePublishCheck articlePublishCheck() {ContentLengthCheck firstCheck = this.contentLengthCheck();firstCheck.setNext(this.sensitiveWordsCheck()).setNext(this.imageCheck()).setNext(this.publishCountCheck());return firstCheck;}
}
7 ArticleController: 控制器类,处理文章发布请求,使用责任链进行校验。
import com.example.demo_23.aaaaa.article.IArticlePublishCheck;
import com.example.demo_23.aaaaa.dto.ArticlePublishRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ArticleController {@Autowiredprivate IArticlePublishCheck articlePublishCheck;/*** 发布文章,责任链版本实现,更容易扩展** @param req* @return*/@PostMapping("/article/publishNew")public Object publishNew(@RequestBody ArticlePublishRequest req) {try {this.articlePublishCheck.check(req);return "发布成功";} catch (RuntimeException e) {return "发布失败:" + e.getMessage();}}
}
相关文章:

责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例
需求:后端需要提供一个文章发布的接口,接口中需要先对文章内容进行如下校验,校验通过后才能发布 1. 文章长度不能超过1万个字符 2. 不能有敏感词 3. 文章中图片需要合规 责任链相当于一个链条一样,链条上有很多节点,节…...

Java流程控制语句——条件控制语句详解(附有流程图)#Java条件控制语句有哪些?#if-else、switch
在 Java 编程中,条件控制语句用于控制程序的执行路径,决定根据某些条件来选择执行某段代码或跳过某段代码。它们是 Java 编程的重要组成部分,帮助开发者根据不同的输入、状态或数据流来编写更加灵活和动态的代码。在本文中,我们将…...
十一、SOA(SOA的具体设计模式)
我们现在深入学习SOA的具体设计模式。SOA架构中的设计模式主要是指导服务如何设计、实现、部署和管理,确保服务的松耦合、高可用性、扩展性和复用性。SOA常见的设计模式可以分为以下几类: 1. 服务层次设计模式 1.1. 基础服务(Fundamental S…...

Mybatis原理
一. 为什么要使用Mybatis? 1.1 jdbc的使用步骤 首先,在pox.xml中引入MySQl驱动的依赖 第一步, Class.forName 注册驱动 第二步,获取一个Connection。 第三步,创建一个Statement对象。 第四步,execute()方法执行SQL。execute()方…...

黑马头条day3-2 自媒体文章管理
前边还有一个 素材列表查询 没什么难度 就略过了 查询所有频道和查询自媒体文章也是和素材列表查询类似 就是普通的查询 所以略过了 文章发布 这个其实挺复杂的 一共三张表 一个文章表 一个素材表 一个文章和素材的关联表 区分修改与新增就是看是否存在id 如果是保存草稿…...

JinDouYun性能测试工具使用方法
1.功能介绍 2. 安卓端支持安卓6及以上的版本,ios支持大部分版本 3. 可以测试游戏,视频,普通应用的性能数据,数据精准,低延迟,无侵入 4.工具下载链接 筋斗云 5.后续功能添加,高版本支持&…...

操作系统 | 学习笔记 | | 王道 | 5.3 磁盘和固态硬盘
5.3 磁盘和固态硬盘 5.3.1 磁盘 磁盘结构 磁盘:磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据 磁道:磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道 扇区:一个磁道又被划分成一个个扇区&am…...

【Oauth2整合gateway网关实现微服务单点登录】
文章目录 一.什么是单点登录?二.Oauth2整合网关实现微服务单点登录三.时序图四.代码实现思路1.基于OAuth2独立一个认证中心服务出来2.网关微服务3产品微服务4.订单微服务5.开始测试单点登录 一.什么是单点登录? 单点登录(Single Sign On&…...

WEB领域是不是黄了还是没黄
进入2024年后,WEB领域大批老表失业,一片哀嚎,个个饿的鬼叫狼嚎,为啥呢,下面是我个人的见解和看法。 中国程序员在应用层的集中 市场需求:中国的互联网行业在过去几年中经历了爆炸性增长,尤其是…...
Android系统:系统架构
文章目录 分层设计分块设计总结 分层设计 自上而下分为:应用层、应用架构层、系统运行层、硬件抽象层、Linux内核层 应用层 封装一系列系统App 应用架构层(Framework) 封装一系列运行App需要的Java框架 提供App开发需要的API 系统运行层(Libraries) 封装一系…...

NCNN 源码(1)-模型加载-数据预处理-模型推理
参考 ncnn 第一个版本的代码。 0 整体流程 demo:squeezenet ncnn 自带的一个经典 demo:squeezenet 的代码: // 网络加载 ncnn::Net squeezenet; squeezenet.load_param("squeezenet_v1.1.param"); squeezenet.load_model("squeezenet_…...
重修设计模式-结构型-享元模式
重修设计模式-结构型-享元模式 复用不可变对象,节省内存 享元模式(Flyweight Pattern)核心思想是通过共享对象方式,达到节省内存和提高性能的目的。享元对象需是不可变对象,因为它会被多处代码共享使用,要避…...
JavaScript 运算符
JavaScript 中的运算符可以根据其功能和用途分为几类。以下是主要的运算符类型及其用法: 1. 算术运算符 用于执行基本的数学运算。 : 加法 let sum 5 3; // 8- : 减法 let difference 5 - 3; // 2* : 乘法 let product 5 * 3; // 15/ : 除法 let quotient 5…...

3.js - 运动曲线
这个球,绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据,一系列的点,创建曲线 le…...

免费ppt模板哪里找?职场必备这些利器
一眨眼,9月份的尾声渐近,无论是学生还是职场人士,都开始准备着新一轮的演讲和报告。在这个忙碌的时期,一份精美的PPT模板能够大幅提升你的工作效率,让你的演示更加引人入胜。 不用担心高昂的版权费用,市场…...
wampserve 配置本地域名,出现错误
概述 今天更换了电脑,在本地安装和配置docker的时候,想用自定义域名访问NGINX容器,127.0.0.1和localhost都可以访问,但是自定义域名无法访问, 接着去捯饬已经使用的wampserver的集成环境,出现了同样的问题…...

MySQL慢查询优化指南
博客主页: 南来_北往 系列专栏:Spring Boot实战 前言 当遇到慢查询问题时,不仅影响服务效率,还可能成为系统瓶颈。作为一位软件工程师,掌握MySQL慢查询优化技巧至关重要。今天,我们就来一场“数据库加速之旅…...

怎么录制游戏视频?精选5款游戏录屏软件
对于热爱游戏的你来说,记录游戏中的精彩瞬间并分享给朋友或粉丝,无疑是一种享受。然而,在众多录屏软件中,如何选择最适合你的那一款?今天,我们就为大家精选了五款游戏录屏软件,需要的朋友快来选…...

论文阅读 - MDFEND: Multi-domain Fake News Detection
https://arxiv.org/pdf/2201.00987 目录 ABSTRACT INTRODUCTION 2 RELATED WORK 3 WEIBO21: A NEW DATASET FOR MFND 3.1 Data Collection 3.2 Domain Annotation 4 MDFEND: MULTI-DOMAIN FAKE NEWS DETECTION MODEL 4.1 Representation Extraction 4.2 Domain Gate 4.…...

LabVIEW软件出现Bug如何解决
在LabVIEW开发中,程序出现bug是不可避免的。无论是小型项目还是复杂系统,调试与修复bug都是开发过程中的重要环节。下文介绍如何有效解决LabVIEW软件中的bug,包括常见错误类型、调试工具、错误处理机制。 1. 常见Bug类型分析 在LabVIEW中&am…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...