责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例
需求:后端需要提供一个文章发布的接口,接口中需要先对文章内容进行如下校验,校验通过后才能发布
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…...

【数据结构-栈】力扣844. 比较含退格的字符串
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。 示例 1: 输入:s “ab#c”, t “…...

DataFrame生成excel后为什么多了一行数字
问题描述 python查询数据生成excel文件,生成的excel多了第一行数字索引,1,2,3,4,5...... 代码: df pd.DataFrame(data)df.to_excel(filename, sheet_name用户信息表, indexFalse) 解决: 原理也很简单,就是设置个参…...

linux 内存屏障(barrier)分析
谈起内存屏障,大家感觉这个"玩意儿"很虚,不太实际,但是内核代码中又广泛地可以看到起身影。内存屏障,英文barrier,这个"玩意儿"它还不太好去定义它。barrier,中文翻译为栅栏,栅栏大家都见过,现实生活中就是防止他人或者动物非法闯入而用来进行隔…...

【人工智能】Transformers之Pipeline(十九):文生文(text2text-generation)
目录 一、引言 二、文生文(text2text-generation) 2.1 概述 2.2 Flan-T5: One Model for ALL Tasks 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.3.3 pipeline返回参数 …...

如何使用ssm实现基于VUE的儿童教育网站的设计与实现+vue
TOC ssm676基于VUE的儿童教育网站的设计与实现vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全…...

MODBUS TCP 转 CANOpen
产品概述 SG-TCP-COE-210 网关可以实现将 CANOpen 接口设备连接到 MODBUS TCP 网络中。用户不需要了解具体的 CANOpen 和 Modbus TCP 协议即可实现将CANOpen 设备挂载到 MODBUS TCP 接口的 PLC 上,并和 CANOpen 设备进行数据交互。 产品特点 …...

vue2+elementUI实现handleSelectionChange批量删除-前后端
功能需求:实现选中一个或多个执行批量删除操作 在elementUI官网选择一个表格样式模板,Element - The worlds most popular Vue UI framework 这里采用的是 将代码复制到前端,这里是index.vue <template><el-button type"dang…...

LLMs之OCR:llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略
LLMs之OCR:llm_aided_ocr(基于LLM辅助的OCR项目)的简介、安装和使用方法、案例应用之详细攻略 目录 llm_aided_ocr的简介 1、特性 2、详细技术概览 PDF处理和OCR PDF到图像转换 OCR处理 文本处理流程 分块创建 错误校正与格式化 重复内容移除 标题和页码…...

低代码平台后端搭建-阶段完结
前言 最近又要开始为跳槽做准备了,发现还是写博客学的效率高点,在总结其他技术栈之前准备先把这个专题小完结一波。在这一篇中我又试着添加了一些实际项目中可能会用到的功能点,用来验证这个平台的扩展性,以及总结一些学过的知识。…...

暑假考研集训营游记
文章目录 摘要:1.对各大辅导机构考研封闭集训营的一些个人看法:2.对于考研原因一些感想:结语 摘要: Ashy在暑假的时候参加了所在辅导班的为期一个月的考研封闭集训营,有了一些全新的感悟,略作记录。 1.对…...